我在 C++11 中使用新的随机数生成器。尽管有不同的意见,但从这个线程来看,似乎大多数人认为它们不是线程安全的。因此,我想制作一个程序,其中每个线程都使用自己的 RNG。
在有关如何使用 OpenMP 完成此操作的相关讨论中给出了一个示例:
#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"
using namespace std;
int main()
{
unsigned long long app = 0;
{
//mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
mt19937_64 engine; //USE FOR SINGLE THREAD
uniform_real_distribution<double> zeroToOne(0.0, 1.0);
//#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
for (unsigned long long i = 0; i < 2000000000; i++)
{
if(zeroToOne(engine) < 0.5) app++;
}
}
cout << app << endl;
return 0;
}
当我运行该程序的多线程和单线程版本并跟踪时间时,它们在执行后需要相同的时间才能完成。另外,app
两种情况下的大小不一样,但我怀疑这仅仅是因为种子不同。
问题:提供的示例是否正确显示了如何强制每个线程使用自己的 RNG?如果没有,我可以看到一个如何做到这一点的例子,或者获得他们解释如何实现这一点的某个地方的参考吗?