シミュレーションで乱数を生成するために、シーケンシャルシード(1、2、3、4、...)を使用しています。シードが互いに近くにあるという事実は、生成された疑似乱数も同様にしますか?
何も変わらないと思いますが、Pythonを使っています
編集:私はいくつかのテストを行いましたが、数字は似ていません。ただ、数字を見ただけでは類似性に気付かないのではないかと思います。異なるシードが完全に独立した疑似乱数を与えることを保証する乱数生成の理論的特徴はありますか?
定義上、シードと生成された乱数の間には間違いなく相関関係があります。問題は、ランダム化アルゴリズムが無相関に見える結果を生成するのに十分であるかどうかです。その質問に答えるには、ランダム性を評価する方法を検討する必要があります。
しかし、あなたは心配するのは正しいです。rand
シード値が0から9のMicrosoftのC++関数の結果は次のとおりです。
38 7719 21238 2437 8855 11797 8365 32285 10450 30612
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
45 29216 24198 17795 29484 19650 14590 26431 10705 18316
48 7196 9294 9091 7031 23577 17702 23503 27217 12168
51 17945 27159 386 17345 27504 20815 20576 10960 6020
54 28693 12255 24449 27660 31430 23927 17649 27472 32640
58 6673 30119 15745 5206 2589 27040 14722 11216 26492
61 17422 15215 7040 15521 6516 30152 11794 27727 20344
64 28170 311 31103 25835 10443 497 8867 11471 14195
68 6151 18175 22398 3382 14369 3609 5940 27982 8047
複数のシミュレーションにシーケンシャルシードを使用した場合に、メルセンヌツイスターから生成されたランダム数に測定可能な、しかし小さい相関関係があることがわかりました。その結果は平均化されて最終結果が得られます。Linux上のPythonでは、random.SystemRandom()を介してシステムランダム関数(非疑似乱数)によって生成されたシードを使用すると、相関関係がなくなります。SystemRandom番号をファイルに保存し、シミュレーションでシードが必要になったときにそれらを読み取ります。シードを生成するには:
import random
myrandom = random.SystemRandom
x = myrandom.random # yields a number in [0,1)
dump x out to file...
その後、シードが必要な場合
import random
read x from file...
newseed = int(x*(2**31)) # produce a 32 bit integer
random.seed(newseed)
nextran = random.random()
nextran = random.random()...
まず、類似性を定義します。次へ:類似性テストをコーディングします。次に、類似性を確認します。
類似性の漠然とした説明だけでは、それをチェックするのは難しいです。
どんなシミュレーションをしていますか?
シミュレーションの目的では、引数は有効です(シミュレーションのタイプによって異なります)が、シミュレーション以外の環境で実装する場合、生成されたランダムな数値に基づいて環境のセキュリティ上の懸念がある必要がある場合は、簡単にハッキングされる可能性があります。
機械が社会に有害であるかどうかにかかわらず、機械の結果をシミュレートしている場合、その結果は受け入れられません。それは可能な限りあらゆる方法で最大のランダム性を必要とし、私はあなたの推論を決して信用しません。
ランダムモジュールからドキュメントを引用するには:
基礎となるメルセンヌツイスターコアジェネレーターに関する一般的な注意事項:
- 期間は2**19937-1です。
- これは、現存する中で最も広範囲にテストされたジェネレーターの1つです。
RNGが十分にランダムでないよりも、コードが壊れていることを心配します。一般に、ランダム性についてのあなたの腸の感情は間違っているでしょう-人間の心は、パターンが存在しなくても、パターンを見つけるのが本当に得意です。
ランダムシードがないために結果が「安全」にならないことがわかっている限り、問題はありません。
シーケンシャルシードが心配な場合は、シーケンシャルシードを使用しないでください。既知のシードを使用してマスターRNGをセットアップし、そのマスターRNGから連続して出力を取得して、必要に応じてさまざまな子RNGをシードします。
マスターRNGの初期シードがわかっているため、必要に応じて、シミュレーション全体を以前とまったく同じように再実行できます。
masterSeed <- 42
masterRNG <- new Random(masterSeed)
childRNGs[] <- array of child RNGs
foreach childRNG in childRNGs
childRNG.setSeed(masterRNG.next())
endforeach