C++ openMP使用相同的种子生成不同的随机数

C++ openMP使用相同的种子生成不同的随机数,c++,openmp,srand,C++,Openmp,Srand,我是openMP新手,在我的程序中,需要复杂的模拟来重复结果,为每个模拟设置种子,但是,在实施openMP时,每次运行它都会产生不同的结果。所以我写了一个简单的例子来检查这个问题,如下所示, 我每次也会产生不同的结果: #include <iostream> #include <omp.h> using namespace std; int main () { double A[10]; #pragma omp parallel for for( int i=0;

我是openMP新手,在我的程序中,需要复杂的模拟来重复结果,为每个模拟设置种子,但是,在实施openMP时,每次运行它都会产生不同的结果。所以我写了一个简单的例子来检查这个问题,如下所示, 我每次也会产生不同的结果:

#include <iostream>
#include <omp.h>
using namespace std;


int main () {

double A[10];

#pragma omp parallel for
for( int i=0;i<10;i++){
    srand(i+1);
    int m = rand()%100;
    A[i] = m;
}

cout<<"A= \n";

for(int i=0;i<10;i++){
    cout<<i<<" "<<A[i]<<" \n";
}
   return 0;
}
#包括
#包括
使用名称空间std;
int main(){
双A[10];
#pragma-omp并行
对于(inti=0;i这是一个错误

A[i] += m;
您正在读取[i]
的先前值,该值从未被赋值。这是未定义的行为。请重试

A[i] = m;

然后,请注意,随机数状态可能不是threadlocal。请获取更好的RNG,其中有一个显式状态变量,而不是访问共享全局状态。

rand()使用静态且不是线程安全的。您需要使用不同的线程安全PRNG。请参阅或

谢谢,这确实是一个问题,但即使我更改了它,问题仍然存在。如果我删除“#pragma omp parallel for”,我可以得到相同的结果,但是如果我加上那一行,每次的结果都不一样。而且,我不太明白你最后对RNG的评论,你能解释得更清楚一点吗?非常感谢!@user3159019:Many RNG(随机数生成器)作为对象实现,并使用成员变量来存储种子/状态,而不是全局。每个线程需要有单独的状态,最简单的方法是每个线程使用自己的RNG对象。新的C++11标准定义了一组RNG类。请参阅