状態を隠すことなく、前の出力から純粋関数のように計算できる、優れた疑似乱数ジェネレーターが必要です。「良い」とは、次のことを意味します。
2^n
任意のパラメーター(またはそれらの大きなサブセット)を使用して反復でジェネレーターを実行する0
と、との間のすべてまたはほぼすべての値をカバーするようにジェネレーターをパラメーター化できる必要があります。2^n - 1
ここn
で、は出力値のビット数です。ビットの結合されたジェネレーター出力は、そのパラメーターのすべての可能な組み合わせに対して反復で実行する場合、
n + p
すべてまたはほぼすべての値をカバーする必要があり0
ます。ここで、はパラメーターのビット数です。2^(n + p) - 1
2^n
p
たとえば、LCGは純粋関数のように計算でき、最初の条件を満たすことはできますが、2番目の条件を満たすことはできません。たとえば、32ビットLCGがm = 2^32
あり、それは一定であるためp = 64
(2つの32ビットパラメーターa
とc
)n + p = 96
、、 2番目の条件を満たすには、出力から3intずつデータをピークする必要があります。残念ながら、出力の奇数と偶数のintのシーケンスが厳密に交互になっているため、条件を満たせません。これを克服するには、隠された状態を導入する必要がありますが、それは機能を純粋ではなく、最初の条件(長い隠された期間)を壊します。
編集:厳密に言えば、ビットによってパラメーター化され、p
ビットの完全な状態を備えた関数ファミリーが必要です。各関数は、 -bit intを連続的にインクリメントするだけでなく、一意の「ランダムな」方法n
でビットのすべての可能なバイナリ文字列を生成します。そのユニークな方法を選択するために必要なパラメータ化。p + n
(p + n)
欲しすぎですか?