5

異なるマシンでモンテカルロ シミュレーションを並行して実行する必要があります。コードは C++ で書かれていますが、プログラムは多くのこと、特にランダム シードを設定する Python スクリプトでセットアップされ、起動されます。関数 setseed は 4 バイトの符号なし整数を取得します

シンプルな

import time
setseed(int(time.time()))

ジョブをクラスターのキューに送信したため、ジョブは数分間保留されたままになり、その後開始されるため、あまり良くありませんが、開始時刻は予測できません。2 つのジョブが同時に開始される可能性があります (秒)。切り替える:

setseet(int(time.time()*100))

しかし、私は幸せではありません。最善の解決策は何ですか?たぶん、時間、マシン ID、プロセス ID からの情報を組み合わせることができます。それとも、/dev/random (Linux マシン) から読み取るのが最善の解決策でしょうか?

/dev/random から 4 バイトを読み取るには?

f = open("/dev/random","rb")
f.read(4)

文字列を教えてください。整数が必要です!

4

4 に答える 4

5

から読むの/dev/randomは良い考えです。4 バイト文字列を整数に変換するだけです。

f = open("/dev/random","rb")
rnd_str = f.read(4)

構造体を使用するか:

import struct
rand_int = struct.unpack('I', rnd_string)[0]

大文字の I を更新する必要があります。

または、乗算して追加します。

rand_int = 0
for c in rnd_str:
    rand_int <<= 8
    rand_int += ord(c)
于 2010-03-07T12:48:40.870 に答える
2

4 バイトを単純に整数にコピーすることもできますが、これは心配する必要はありません。

しかし、並列疑似乱数生成はかなり複雑なトピックであり、うまく行われていないことがよくあります。通常、1 台のマシンでシードを生成し、他のマシンに配布します。

あなたの問題を正確に処理するSPRNGを見てください。

于 2010-03-07T12:49:11.283 に答える
1

これが Linux または同様の OS である場合は、必要に応じ/dev/urandomて、常にすぐにデータを生成します。

/dev/randomシステムがランダム性を収集するのを待って停止する可能性があります。暗号グレードの乱数を生成しますが、それはあなたの問題にとってはやり過ぎです。

于 2010-03-07T21:34:09.223 に答える