带有OpenMP线程安全随机数的C ++

时间:2015-05-11 12:55:25

标签: c++ multithreading random openmp

我试图绘制一些随机点,然后用它们计算smth。我使用的线程很少,但我的随机并不是那么随机,因为它应该是......我的意思是当我使用rand()时我得到了正确的答案,但是很慢(因为静态兰特),所以我使用的是rand_r有种子,但我的计划的答案总是很糟糕。

double randomNumber(unsigned int seed, double a, double b) {
    return a + ((float)rand_r(&seed))/(float)(RAND_MAX) * (b-a);
}

我的节目:

#pragma omp parallel
for(int i = 0; i < points; i++){
    seedX = (i+1) * time(NULL);
    seedY = (points - i) * time(NULL);

    punkt.x = randomNumber(seedX, minX, maxX);
    punkt.y = randomNumber(seedY, minY, maxY);
...
}

我在其他主题(一些mt19937生成器等)中找到了一些解决方案,但我无法编译任何东西。

我正在使用g ++ -fopenmp进行编译。(g ++(Ubuntu 4.8.2-19ubuntu1)4.8.2)

修改

seed = rand();
#pragma omp parallel
for(int i = 0; i < points; i++){


    punkt.x = randomNumber(seed, minX, maxX);
    punkt.y = randomNumber(seed, minY, maxY);
...
}

2 个答案:

答案 0 :(得分:1)

for循环的每次迭代中重新播种您的生成器将破坏其统计属性。

此外,如果使用两个线性同余生成器提取它们,您可能会在x和y值之间引入相关性。

保持简单;使用一个发电机和一个种子。

展望未来,我建议您使用mt19937,因为它仍然会有更好的属性。线性同余生成器可能无法通过卡方检验进行自相关,如果将其用于x,y图,这一点尤其重要。

答案 1 :(得分:0)

我相信其他人试图说的是,使用srand(some number)在构造函数中播种一个,然后不再播种。

class someRandomNumber {

}