7

C++ 11 で新しい乱数ジェネレーターを使用しています。さまざまな意見がありますが、このスレッドから見ると、大多数はスレッドセーフではないと考えているようです。結果として、各スレッドが独自の RNG を使用するプログラムを作成したいと思います。

OpenMP でこれを実現する方法の関連する説明に、例が示されています。

#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"

using namespace std;



int main()
{
    unsigned long long app = 0;
    {
        //mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
        mt19937_64 engine; //USE FOR SINGLE THREAD
        uniform_real_distribution<double> zeroToOne(0.0, 1.0);

        //#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
        for (unsigned long long i = 0; i < 2000000000; i++)
        {
            if(zeroToOne(engine) < 0.5) app++;
        }
    }
    cout << app << endl;
    return 0;
}

このプログラムのマルチスレッド版とシングルスレッド版を実行して時間を追跡すると、実行後、完了するまでに同じ時間がかかります。また、appは 2 つのケースで同じサイズではありませんが、それは単にシードが異なるためだと思われます。

質問: 提供された例は、各スレッドに独自の RNG を強制的に使用させる方法を正しく示していますか? そうでない場合、これがどのように行われるかの例を見ることができますか、またはこれを達成する方法を説明している場所への参照を得ることができますか?

4

2 に答える 2

2

ランダムシードの使用は控えます。ストリームが重複してしまう可能性があります。これは最終的に最終的な統計に影響します。

このような試行錯誤されたソリューションをお勧めします

于 2013-04-10T09:55:10.013 に答える