我正在尝试绘制一些随机点,然后用它们计算 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);
...
}
最佳答案
在 for
循环的每次迭代中重新播种生成器会破坏它们的统计属性。
此外,如果您使用两个线性同余生成器提取 x 和 y 值,则可能会在它们之间引入相关性。
保持简单;使用一个生成器和一个种子。
展望 future ,我建议您使用 mt19937,因为它仍然具有更好的特性。线性同余生成器可能无法通过自相关的卡方检验,如果您将其用于 x、y 图,这一点尤为重要。
关于带有 OpenMP 线程安全随机数的 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30168252/