用相同的引擎并行生成随机数是失败的

Generating random numbers in parallel with identical engines fails

本文关键字:随机数 失败 并行 引擎      更新时间:2023-10-16

我正在使用c++ 11提供的RNG,我也在玩弄OpenMP。我为每个线程分配了一个引擎,作为测试,我给每个引擎分配了相同的种子。这意味着我期望两个线程产生完全相同的随机生成的数字序列。这是一个MWE:

#include <iostream>
#include <random>
using namespace std;

uniform_real_distribution<double> uni(0, 1);
normal_distribution<double> nor(0, 1);

int main()
{
    #pragma omp parallel
    {
        mt19937 eng(0); //GIVE EACH THREAD ITS OWN ENGINE
        vector<double> vec;
        #pragma omp for
        for(int i=0; i<5; i++)
        {
            nor(eng);
            vec.push_back(uni(eng));
        }
        #pragma omp critical
        cout << vec[0] << endl;
    }

    return 0;
}

大多数情况下我得到的输出是0.857946 0.857946,但有几次我得到的是0.857946 0.592845。当两个线程具有相同的、不相关的引擎时,后一种结果怎么可能呢?

您必须将noruni也放在omp parallel区域内。这样的:

#pragma omp parallel
{
    uniform_real_distribution<double> uni(0, 1);
    normal_distribution<double> nor(0, 1);
    mt19937 eng(0); //GIVE EACH THREAD ITS OWN ENGINE
    vector<double> vec;

否则每个线程只会有一个副本,而实际上每个线程都需要自己的副本。

更新为添加:我现在看到完全相同的问题在这个stackoverflow线程