【问题标题】:C++ with OpenMP thread safe random numbers具有 OpenMP 线程安全随机数的 C++
【发布时间】:2015-05-11 12:55:25
【问题描述】:

我正在尝试绘制一些随机点,然后用它们进行计算。我使用的线程很少,但我的随机数并不像它应该的那样随机......我的意思是当我使用 rand() 时,我得到了正确的答案,但非常慢(因为静态 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);
...
}

【问题讨论】:

    标签: c++ multithreading random openmp


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我需要使用多线程,因为它是非常多点的任务,没有线程它会花费太多时间。当我只使用seedX 时,它也给出了一些明确的答案。 :(
    • 多播一次就可以了。
    • 我不确定我是否理解正确。我在第一条评论中更新了代码。它仍然不起作用。对于在每次迭代中计算的一个种子变量。我什至在每个线程中添加了种子的线程号
    • 第三次,恰好播种一次。您看不到您在每次迭代中都在重新播种吗?你认为播种能取得什么成就?
    • 所以我在循环之前生成了种子(编辑代码),现在它每次都绘制相同的数字
    【解决方案2】:

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

    类 someRandomNumber {

    }

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2020-01-31
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多