私は昨日、スレッドについて質問し、ユーザが指定するスレッドの量を作成するための入力を得ました。私はあなたの助けを借りてそれを理解することができました。私はこの時間以外は同じプログラムで作業していますが、私はプログラム内の各スレッドを独立して乱数ジェネレータにシードするための助けが必要です。これが簡単なのであれば、謝罪します。私はまだスレッドに新しいです。スレッド、乱数ジェネレータを別々にシードする方法は?
基本的に私のプログラムは、作成したいスレッドの数と投げたい矢印の数をユーザーに求めています。それぞれの矢印は、-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ずつ:あなたがする必要がある場合、あなたはそれを実行することができますので、コードを働いていますなぜ私のスレッドが乱数ジェネレータを独立してシードしていないのかを理解する。誰が何が起こっているのか知っていますか?私はまだスレッドに新しいです。どんなに助けても大歓迎です。どうもありがとうございました。
停止してそれぞれに[乱数発生器(http://en.cppreference.com/w/cpp/numeric/random)を作成糸。 – NathanOliver
なぜ独立してRNGをシードするには別のスレッドが必要ですか?これは一度だけシードする必要があります。これは追加のスレッドを開始する前に行うことができます。 'srand()'と 'rand()'はスレッドセーフではないことに注意してください。 –
ジェネレータをスレッドに入れないでください。スレッドを開始する前にシードしてください。 rand()とsrand()で使用しているジェネレータは、プログラム全体で一意です。もう一つの問題は 'rand'はスレッドセーフではないということです。 – SergeyA