適切な PRNG (疑似乱数ジェネレーター) アルゴリズムには、同じ状態になることのないサイクル タイムがあります。PRNG から取得した数値で PRNG の状態全体を公開すると、ジェネレーターの期間中に一意であることが保証された数値が得られます。
これを行う単純な PRNG は、次の式を反復する' Linear Congruential ' PRNG と呼ばれます。
X(i) = AX(i-1)|M
係数の適切なペアを使用すると、32 ビット アキュムレータを使用した単純な PRNG から 2^30 (約 10 億) の期間を取得できます。計算の中間の 'AX' 部分を保持するには、64 ビット長の long 一時変数が必要になることに注意してください。すべてではないにしても、ほとんどの C コンパイラがこのデータ型をサポートします。ほとんどの SQL 方言では、数値データ型でも実行できるはずです。
A と M の適切な値を使用すると、優れた統計的および幾何学的特性を持つ乱数ジェネレーターを取得できます。これについては、Fishman と Moore によって書かれた有名な論文があります。
M = 2^31 - 1 の場合、以下の A の値を使用して、かなり長い期間 (2^30 IIRC) の PRNG を取得できます。
A の適切な値:
742,938,285
950,706,376
1,226,874,159
62,089,911
1,343,714,438
このタイプのジェネレータは (定義により) 暗号的に安全ではないことに注意してください。それから生成された最後の数を知っていれば、次に何をするかを予測できます。残念ながら、暗号化されたセキュリティと保証された非反復性を同時に得ることはできないと思います。PRNG が暗号的に安全であるためには (例: Blum Blum Shub )、生成された数値で十分な状態を公開して、シーケンス内の次の数値を予測できるようにすることはできません。したがって、内部状態は生成された数よりも広く、(セキュリティを確保するために) 期間は生成可能な値の数よりも長くなります。これは、公開された数が期間内で一意ではないことを意味します。
同様の理由で、メルセンヌ・ツイスターのような長周期発電機にも同じことが言えます。