2016-10-05 11 views
0

乱数ジェネレータをシードにして、異なるプロセッサ上で異なる数列を持つようにするにはどうすればよいですか?C++ RNG:異なるプロセッサで異なるrandジェネレータを取得する方法は?

最初の試みでは、プロセッサのランクをシードとして使用していました。 次に、srand(0)srand(1)と同じ順序を与えるという難しい方法を見つけました。

現在、私はこれをやっている:

srand(time(NULL) + rank) 

これはOKアプローチですか?それとも良い方法がありますか? ありがとう

+2

時間をシードとして使用するのは一般的ですが、それはできません。 – UKMonkey

+3

C++ 11以上の場合は、[''](http://en.cppreference.com/w/cpp/header/random)でジェネレータを使うことを検討してください。 – NathanOliver

+0

ちょっと@UKMonkey ' time(NULL) 'を返しますが、時にはすべてのprocsが同じシードを取得することがあります。 私は各プロセッサにEVERYTIMEという独自のシードが必要です。 – 0x56794E

答えて

1

rand()が初期化された異なる種を生成し、time(NULL)をプロセスとスレッドに渡します。はい、rand()以外のものを使用してください。

+1

time()は1秒の粒度を持っています... –

+0

私は一度だけ使用します。 – knivil

0

* nix環境の場合は、/dev/randomまたは/dev/urandomをエントロピーのソースとして使用してください。 Windowsでは、CryptGenRandom()

1

RNGをシードするマルチスレッド環境での呼び出し時間()は、問題を求めています。スレッドはすべて同じ時間になる可能性があり、異なるスレッドになる可能性があり、制御が難しいです。最初にやっていたように、プロセッサランクのRNGにシードを付けるが、シードとうまく動作するまともなRNGを使用するか、rand()を使用する必要がある場合はランクを使ってシードを少し上げる。ランク* 5 + 123;

関連する問題