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

标签 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);
...
}

最佳答案

for 循环的每次迭代中重新播种生成器会破坏它们的统计属性。

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

保持简单;使用一个生成器和一个种子。

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

关于带有 OpenMP 线程安全随机数的 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30168252/

相关文章:

c++ - 在 C/C++ 中使用 ProtoBuf 进行深度复制

c++ - 将 8 位值掩码为 32 位值

java - 线程代码中的 NullPointerException 导致线程终止

c++ - 给每个给定的自然数分配一个随机自然数

c++ - 为什么使用空字符串流会产生依赖于编译器优化的结果

c++ - 具有不同返回类型的变体访问者

java - 工作线程发送到 sleep 后,CompletableFuture没有响应

java - 不同类方法的同步

unit-testing - 涉及随机数的单元测试算法

不能完全理解 1992 年 Schneier 的这个简单的伪随机生成器