3

マルチスレッドループでランダムを使用する必要がありますが、そのサイクルを評価しているスレッドに関係なく、各ループで同じ値が必要です。

マルチスレッドなしでできること:

seed(1)
for (unsigned int i=0; i<100; i++){
     rand()
}

ループ内で rand() が呼び出されるたびに、新しい疑似乱数値が返されます。今、同じリストをマルチスレッドで作成したいと考えています。

主な理由は、ループの順序に関係なく、疑似乱数の同じシーケンスが必要だからです (ループ内の 'i' に基づくようなものです)。

注:私は多くの「ランダム」および「マルチスレッド」のトピックを調べてきましたが、数値が常にランダムであることを確認する方法に関する解決策のみを見つけました。その逆ではありません.

編集:

結果は、シードに基づいてランダム リストが作成されたかのようになります。そして、そのランダム リストをループ内でインデックス 'i' を使用して使用し、疑似乱数値を取得する必要があります。したがって、ループ内では、同じ乱数がシードに基づいてインデックス 'i' になります。(ただし、ループ全体で単一の乱数が同じであってはなりません。ただし、シーケンスはプログラム実行ごとに同じである必要があります。スレッドの数やサイクルの一部を評価しているスレッドとは無関係です。)

そのリスト (非マルチスレッド) を作成し、その初期化されたリストをマルチスレッド ループ内で使用するのはあまり効率的ではありません。これについて何か考えはありますか?

4

2 に答える 2

4

個別に管理可能な状態で、非 STDC 乱数ジェネレーターを使用します。これをお勧めします: http://www.boost.org/doc/libs/1_52_0/doc/html/boost_random.html

于 2013-02-03T17:56:51.423 に答える
3

合同乱数生成器ではなく、カウンターベースの乱数生成器が必要です。それらがどのように機能するかを説明する適切なドキュメントは次のとおりです。

http://www.thesalmons.org/john/random123/papers/random123sc11.pdf

于 2013-02-03T17:56:58.667 に答える