乱数ジェネレーターには状態があります。これは実際には必要な機能です。次の「乱数」は、前の数とシード/状態の関数です。純粋主義者はそれらを疑似乱数ジェネレーターと呼んでいます。数値はランダム性の統計テストに合格しますが、実際にはランダムではありません。
ランダム値のシーケンスは有限であり、繰り返されます。
乱数ジェネレーターは、数値のコレクションをシャッフルし、ランダムな順序で処理するものと考えてください。シードは、数値を「シャッフル」するために使用されます。シードが設定されると、数字のシーケンスが固定され、予測が非常に難しくなります。一部のシードは、他のシードよりも早く繰り返されます。
ほとんどのジェネレーターには、誰もそれが繰り返されていることに気付かないほど長い期間があります。48ビットの乱数ジェネレーターは、繰り返す前に数千億の乱数を生成します-(AFAIK)32ビットのシード値を使用します。
ジェネレーターは、単一のシードを与えて値を吐き出させた場合にのみ、ランダムに似た値を生成します。シードを変更すると、新しいシード値で生成された数字は、以前のシードで生成された値と比較するとランダムに表示されない場合があります。シードを変更すると、すべての賭けがオフになります。だからしないでください。
健全なアプローチは、1 つのジェネレーターを使用して、さまざまなクライアントに数値を「処理」することです。ジェネレーターの作成と破棄をいじらないでください。種子の交換を台無しにしないでください。
とりわけ、独自の乱数ジェネレーターを作成しようとしないでください。ほとんどの言語ライブラリに組み込まれているジェネレータは非常に優れています。特に 32 ビット以上を使用する最新のもの。
一部の Linux ディストリビューションには/dev/random
and/dev/urandom
デバイスがあります。これらを一度読み取って、アプリケーションの乱数ジェネレーターをシードできます。これらは多かれ少なかれランダムな値を持ちますが、ランダムなシステム イベントから「ノイズを収集」することによって機能します。使用の間に多くのランダムなイベントが発生するように、慎重に使用してください。