2016-04-22 6 views
3

私は昨日、スレッドについて質問し、ユーザが指定するスレッドの量を作成するための入力を得ました。私はあなたの助けを借りてそれを理解することができました。私はこの時間以外は同じプログラムで作業していますが、私はプログラム内の各スレッドを独立して乱数ジェネレータにシードするための助けが必要です。これが簡単なのであれば、謝罪します。私はまだスレッドに新しいです。スレッド、乱数ジェネレータを別々にシードする方法は?

基本的に私のプログラムは、作成したいスレッドの数と投げたい矢印の数をユーザーに求めています。それぞれの矢印は、-1から1までの2つの数字を生成します。これまでの私のプログラムです。私はすべての上に見てきたが、私はまだように見えることはできません

#include <iostream> 
#include <string> 
#include <ctime> 
#include <cstdlib> 
#include <thread> 

using namespace std; 

void exec(int n, int randNumbers) 
{ 
    int seed = 0; 

    srand(seed); 
    int random_number = rand() % 1 + -1; 

    cout << "Thread " << n << endl; 
    cout << "\n"; 

    while (randNumbers != 0) 
    { 
     srand(seed); 
     cout << random_number << endl; 
     seed++; 
     cout << "Seed: " << seed << endl; 
     cout << "\n"; 

     cout << random_number << endl; 
     seed++; 
     cout << "Seed: " << seed << endl; 
     cout << "\n"; 
     randNumbers--; 
    } 
} 


int main() 
{ 
    int numThreads = 0; // Threads 
    int maxRandom; // Arrows 

    cout << "This is a Monte Carlo simulation." << endl; 
    cout << "Please enter the number of threads to run." << endl; 
    cout << "Threads: "; 

    cin >> numThreads; 

    // create an array of threads 
    thread* myThreads = new thread[numThreads]; 

    if ((numThreads > 20) || (numThreads < 1)) 
    { 
     cout << "Sorry. Something went wrong." << endl; 
     return 0; 
    } 

    system("CLS"); 
    cout << "\n"; 
    cout << "Enter the number of arrows you would like to throw: " << endl; 
    cout << "Arrows: "; 

    cin >> maxRandom; // Arrows 

    system("CLS"); 
    for (int i = 0; i < numThreads; i++) 
    { 
     // run random number generator for thread at [i] 
     myThreads[i] = thread(exec, i, maxRandom); 
    } 

    for (int i = 0; i < numThreads; i++) 
    { 
     myThreads[i].join(); 
    } 

    cout << "Done!" << endl; 
} 

は、すべてのスレッドが戻ってきている-1かかわらずint seedが上がる場合の1ずつ:あなたがする必要がある場合、あなたはそれを実行することができますので、コードを働いていますなぜ私のスレッドが乱数ジェネレータを独立してシードしていないのかを理解する。誰が何が起こっているのか知っていますか?私はまだスレッドに新しいです。どんなに助けても大歓迎です。どうもありがとうございました。

+5

停止してそれぞれに[乱数発生器(http://en.cppreference.com/w/cpp/numeric/random)を作成糸。 – NathanOliver

+6

なぜ独立してRNGをシードするには別のスレッドが必要ですか?これは一度だけシードする必要があります。これは追加のスレッドを開始する前に行うことができます。 'srand()'と 'rand()'はスレッドセーフではないことに注意してください。 –

+2

ジェネレータをスレッドに入れないでください。スレッドを開始する前にシードしてください。 rand()とsrand()で使用しているジェネレータは、プログラム全体で一意です。もう一つの問題は 'rand'はスレッドセーフではないということです。 – SergeyA

答えて

1
  1. は、各スレッドがプライベートPRNGを(すべてのスレッドで1共有PRNGを使用してロックする必要があるだろうとによる競合を待っていると、キャッシュにひどく遅くなる)があることを確認してください。
  2. Katzgraberは、セクション7.1のプロセス/スレッド番号に基づいてRandom Numbers in Scientific Computing: An IntroductionのPRNGのシードを提案しています。

それは次のようになります `rand`を用い

long seedgen(void) { 
    long s, seed, pid; // pid from 0 to number of processes/threads - 1 
    pid = ...; /* get processt/thread ID */ 
    s = time (&seconds); /* get CPU seconds since 01/01/1970 */ 
    seed = abs(((s * 181) * ((pid - 83) * 359)) % 104729); 
    return seed; 
} 
+0

これはガベージプロポーザルであり、あなたの再現性のコンセプト全体が枯渇します。あなたが自分でバグを持っているなら、あなたは何をするつもりですか? –

関連する問題