線形合同擬似乱数ジェネレーター(PRNG)を使用しているとします。シード、乗算係数(a)、シフト係数(c)およびモジュラス係数(m)が与えられた場合、PRNGの期間をどのように決定できますか?実験/パターン検出アルゴリズムによって決定しますか、またはその期間を計算するための直接的な式はありますか?
私の質問は特に線形合同法に関するものですが、他のPRNGについても実際に期間がどのように計算されるかについて詳しく知りたいと思います。
線形合同擬似乱数ジェネレーター(PRNG)を使用しているとします。シード、乗算係数(a)、シフト係数(c)およびモジュラス係数(m)が与えられた場合、PRNGの期間をどのように決定できますか?実験/パターン検出アルゴリズムによって決定しますか、またはその期間を計算するための直接的な式はありますか?
私の質問は特に線形合同法に関するものですが、他のPRNGについても実際に期間がどのように計算されるかについて詳しく知りたいと思います。
回答:
フルサイクルの LCG PRNGに制限する場合、答えは簡単です。定義上は単純にです。
特定のシードの非フルサイクルLCG PRNGの期間を見つけるには、シード値をもう一度生成するまでPRNGの反復回数をカウントする必要があります。
参照されているウィキペディアのページから:
期間の長さ
一般的なLCG の周期は最大でであり、一部の選択ではそれよりはるかに短くなります。仮定するとゼロで、LCGは、すべてのシード値の完全な期間があります場合にのみを:
歴史的に、選択の悪さがLCGの非効率的な実装につながっていました。これの特に説明的な例は、1970年代初期に広く使用されていたRANDUであり、この貧弱なLCGの使用のために現在疑問視されている多くの結果につながります。
フルサイクルのLCG PRNGに縛られないなら、あなたは大きなリスクを冒しています。
あなたはしていない場合は知っている与えられたLCGは、あなたが相互に異なる配列の任意の数の発電機で終わる可能性があり、そのうちのいくつかは、可能性がフルサイクルであることをあきれるほど小さく、おそらくさらに悪いことに、悪名高いよりも、ぞっとするランダム性を持っているRANDU発電機。
本当に可能なすべてのシード値をチェックして、アプリケーションに十分な長さのシーケンスが生成されることを確認する必要はありません。
擬似乱数ジェネレーターの優れた入門書として、乱数に関する数値レシピの章を読むことを強くお勧めします。