3

main()でseed(time(null))を1回シードする乱数を生成しようとする2つのスレッドで作業していました。プログラムは、スレッドを操作するときに、独自のルーチンですべてのスレッドに対して乱数を生成する必要があることを理解するまで、セグメンテーション違反が継続的に発生し、そのときはセグメンテーション違反はありませんでした。

すべてのスレッドに対して個別にシードする必要がある理由について、Google で答えを見つけようとしましたが、十分な説得力のある答えが見つかりませんでした。誰か説明してくれませんか?ありがとう!!

4

3 に答える 3

5

短くて率直な答えを与えるには:

rand()スレッドセーフではありません。

明示的なクリティカル セクションを使用せずに複数のスレッドから呼び出すことはできません。

于 2013-03-14T13:49:03.057 に答える
3

Dariusz が述べたように、問題は rand() がスレッドセーフではないことです。

ただし、シードに使用されるストレージを引数として取るnrand48 ( http://linux.about.com/library/cmd/blcmdl3_nrand48.htm ) を使用できます。

このようにして、各スレッドに異なるシード ストレージを関連付けて、乱数ジェネレーターへの呼び出しが個別のメモリ領域で動作するようにすることができます。

于 2013-03-14T14:11:41.730 に答える
0

これが暗号化のためではなく、代わりにモンテカルロの状況またはそのようなものである場合、Mersenne Twister は優れたソリューションです。特に、このバージョンhttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html は、並列またはスレッドでの使用に特化して調整されています。この作業はオリジナルの作者によって行われ、PRNG の期間は非常に長いものです。

于 2013-03-14T13:54:03.363 に答える