gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:16:34 24 4
gpt4 key购买 nike

我正在尝试绘制一些随机点,然后用它们计算 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com