web-dev-qa-db-ja.com

あなたの頭の中で行うのに十分簡単な疑似乱数ジェネレータはありますか?

暗算、または暗算と指で数えることを行うのに十分簡単な疑似乱数ジェネレータはありますか?明らかに、これはかなり単純な数学に制限されます-それは、数学の天才ではなく、平均的な数学能力の誰かができる何か、またはおそらくプログラマーの平均的な能力である必要があります。

私が見つけた最も単純なものは 中央二乗法 ですが、ランダム性の悪いソースであることが知られているだけでなく、鉛筆と紙なしではまだ複雑に見えます。

これを行う唯一の方法が範囲を制限することである場合、たとえば8ビットの数値しか出力できない場合は、それで問題ありません。標準のPRNGアルゴリズムの1つは、8ビットバージョンでは十分単純であると思いますが、32ビットバージョンから8ビットバージョンにそれらを単純化するのに十分な知識はありません。 (私が見たものはすべて、作業しているビット数に応じて異なる特別に選択されたシード番号に依存し、通常は32ビットと64ビットの例のみが示されています。)

27
LeBleu

線形フィードバックシフトレジスタ は、2進法(または2進法でマッピングするのが簡単なため16進法)で考えることに慣れている限り、かなり単純です。

より複雑なものは Xorshift ですが、ビット単位の演算を知っている場合は、同様に操作することも可能です。

15
Michael Madsen

疑似ランダム( Dilbertによると ):

Dilbert Cartoon of 2001-10-25

41
Margus

あなたの頭の中で「意味のある」乱数生成を行うことができます:-)

ランダムなWordを取り出し、それからいくつかのメトリックを計算するように、適切な長さの数値が得られるまで繰り返します。

たとえば、「エクササイズ」という単語は10100101bに変換される可能性があります(変換のアイデアはここで確認できます)。

4
BarsMonster

これはかなり基本的で、ほとんどの人の頭に合うはずです:

  1. 3桁のシード番号から始めます(適切なシードを見つけるのは難しい問題です)。
  2. 9を掛けます。
  3. 下の3桁から4桁目を区切り、2つの数値を加算して新しい3桁の数値にします。
  4. これらの数字を書き留めます。パターンを偽装するには、1桁か2桁の数字を書き留めます。
  5. 必要に応じて2〜4を繰り返します。

あなたがゼロから始めない限り、これは4500の結果の期間を通して繰り返されます。出力はランダムに「見えない」が、10進数であり、真のランダムな結果でさえランダムに見えないため、人間はこの作業に夢中になっている。

私はそれをテストするために公平な方法でそれをバイナリに変換するためにプログラムをハックアップしようとするかもしれません。

代替構成:

  • 3桁で3を掛ける
  • 4桁で6を掛ける
  • 5桁で2を掛ける
3
sh1

Blum Blum Shubについてはどうでしょうか。ただし、素数が小さすぎて安全に使用できません。安全に使用すると処理速度は遅くなりますが、慣れ親しんでいる操作が含まれるため、あまり練習しなくても、おそらくM = 437かやや大きめであれば、扱いやすい速度に到達できる可能性があります。

とにかく、頭の中でできることは安全だと思います。適度なサイズの状態で間違いなく機能するのに十分な数を覚えていないだけです。

まともな腱があれば、指で10ビットLFSRを簡単に実行できます;-)

直接的な答えではありませんが、なぜあなたが尋ねているのかによっては、デッキのカードを使用してキーストリーム(つまり、擬似ランダムシーケンス)を生成する Solitaire に興味があるかもしれません。頭ではできませんが、鉛筆と紙は必要ありません。

3
Steve Jessop

はい私はあなたの頭の中で可能性のあるものを知っています、そしてさらに修正されて真の乱数が数のリストをとることができる場合、10を基数とする数の順序付けられたリストは計算するのが最も簡単な原因です。それらを追加してください。一緒に、その結​​果の番号の1桁の桁番号のみを保持し、それをリストの最後に配置して最初の桁をドロップしてから繰り返します。これにより、真の乱数は生成されませんが、十分にランダムになり、使用することを選択した数のリストのサイズは、最終的には繰り返されますが、大きな初期リストの場合、十分に長い時間繰り返されません。

たとえば、リスト12345で5つの数値のみを使用した場合、次のリストは2345となり、右端の桁は1 + 2 + 3 + 4 + 5ie 15または5となるため、リストは23455になり、ドロップされてもう使用されていないため、次の合計は20 -1(15 + 5からドロップしたものを差し引いたもの)になるため、次のリストは34559、45596、55969、59694となり、ここで停止します。最初は12345でした。

59694を取得した次のシードについては、完全なシードが計算されたときに使用できる一種のショートカットがあります。または、ショートカット自体を使用することもできます。つまり、最後の桁に2を掛けて、最初の桁を減算すると、1桁を2倍にすることは簡単に頭の中で行われます。重要なことは、他のすべての桁とその順序を覚えておくことです。使用する数値のリスト。ただし、最初のリストは慎重に選択する必要があります。たとえば、リストするときにすべてのゼロを選択しないか、無限のゼロのストリームがあり、一部の桁のセットでは長い繰り返しサイクルが生成されます。他のものよりも(ただし、鉛筆またはペンと紙が手元にあれば、紙でこれを行う必要があります... :)これが役立つことを願っています。(少し変更すると、非常に優れた真の乱数ジェネレータが開始されます) 楽しい...

そうでない場合は、私がこれを教えてくれれば幸いです:)(英語があまり得意ではありませんでした!:)

0
John Einem

最も簡単な方法は、頭に浮かぶいくつかの数値を生成し、各桁を合計して10を掛けることです。追加する数値が多いほど、ランダムで偏りが少なくなります。

510932
689275
539108
======
628205
0
Shai Coleman

非決定論的アルゴリズムが許可されている場合、あなたの目は頭の中にあるので、「私の前にある赤いオブジェクトの数と青いものの数を足したものに緑のものの数と最も高いものの高さを加えたもの」のようなものはどうでしょうか。文字gと大文字のAが少なくとも1つ含まれている。」

これを行うには、実際にはかなりランダムな方法があるはずです。

0
EternityForest