C ++中线程分离的随机int生成
Thread separated random int generation in C++
我需要生成三个填充随机 int 的 .txt 文件,在不同的线程中调用生成函数。
问题是,结果我在每个 .txt 文件中都有相同的值。
生成和写入值的函数:
void generateMoves(int limit, std::string outputPath) {
//open fstream
std::ofstream fout;
fout.open(outputPath);
if (!fout.is_open()) {
std::cout << "Error reading " << outputPath << " file. Exiting..." << std::endl;
exit(1);
}
static thread_local std::mt19937 generator;
std::uniform_int_distribution<int> distribution(1, 3);
//generating & writing moves
for (int i = 0; i < limit; i++) {
int value;
value = distribution(generator);
fout << value << std::endl;
}
fout.close();
}
我从 main() 调用这样的线程:
int limit = 1000;
std::thread player1(generateMoves, limit, "player1.txt");
std::thread player2(generateMoves, limit, "player2.txt");
std::thread player3(generateMoves, limit, "player3.txt");
player1.join();
player2.join();
player3.join();
那么,如何正确分离int代呢?
编辑:按照下面的评论,我在每个线程中放入了不同的种子,现在一切正常。随机生成现在看起来像这样:
// put different *s* into each thread
srand(s);
//generating & writing
for (int i = 0; i < limit; i++) {
int value;
value = rand() % 3 + 1;
fout << value << std::endl;
}
如评论所述,您的所有生成器都是从相同的默认种子创建的。给每个生成器一个不同的种子就足够了:
std::random_device rd1;
static thread_local std::mt19937 generator(rd1());
这使用(非常慢)std::random_device
,但仅为 mt 生成器生成唯一的种子。
我需要生成三个填充随机 int 的 .txt 文件,在不同的线程中调用生成函数。
问题是,结果我在每个 .txt 文件中都有相同的值。
生成和写入值的函数:
void generateMoves(int limit, std::string outputPath) {
//open fstream
std::ofstream fout;
fout.open(outputPath);
if (!fout.is_open()) {
std::cout << "Error reading " << outputPath << " file. Exiting..." << std::endl;
exit(1);
}
static thread_local std::mt19937 generator;
std::uniform_int_distribution<int> distribution(1, 3);
//generating & writing moves
for (int i = 0; i < limit; i++) {
int value;
value = distribution(generator);
fout << value << std::endl;
}
fout.close();
}
我从 main() 调用这样的线程:
int limit = 1000;
std::thread player1(generateMoves, limit, "player1.txt");
std::thread player2(generateMoves, limit, "player2.txt");
std::thread player3(generateMoves, limit, "player3.txt");
player1.join();
player2.join();
player3.join();
那么,如何正确分离int代呢?
编辑:按照下面的评论,我在每个线程中放入了不同的种子,现在一切正常。随机生成现在看起来像这样:
// put different *s* into each thread
srand(s);
//generating & writing
for (int i = 0; i < limit; i++) {
int value;
value = rand() % 3 + 1;
fout << value << std::endl;
}
如评论所述,您的所有生成器都是从相同的默认种子创建的。给每个生成器一个不同的种子就足够了:
std::random_device rd1;
static thread_local std::mt19937 generator(rd1());
这使用(非常慢)std::random_device
,但仅为 mt 生成器生成唯一的种子。