我在C++ 11中使用了新的隨機數生成器。雖然有不同的意見,但從這thread看來,大多數人認爲他們不是線程安全的。因此,我想製作一個程序,每個線程使用自己的RNG。如何讓每個線程在C++中使用自己的RNG 11
一個例子是在如何使用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
在兩種情況下的尺寸不一樣,但我懷疑這僅僅是因爲種子不同。
問題:提供的示例是否正確地顯示瞭如何強制每個線程使用自己的RNG?如果沒有,我能看到一個如何完成這個過程的例子,或者參考一些他們解釋如何實現這個目標的地方?
一些久經考驗的解決方案感謝您對這個例子中,這是非常有幫助的。我有兩個問題:(1)我可以問你爲什麼選擇包含':engines()'?嚴格來說,這是必需的嗎? ....(2)我可以在我的程序中的後續循環中使用對象'rand',它不是並行化的嗎? – BillyJean 2013-04-10 11:49:24
@BillyJean(1)不需要但我的個人風格調用初始化列表中的每個元素ctor,如果至少有一個被調用。 (2)不是100%確定的,但我認爲對於非並行區域,omp_get_thread_num()返回0,所以是。 – hansmaad 2013-04-10 12:02:41
最後一個問題:假設我讓全局的'RNG'和它的對象'rand'全局。現在我調用一個全局函數'func',而不是條件'(rand()<0.5)',它執行一些依賴於'rand'的計算。在'func'中使用'rand'仍然是線程安全的嗎?我會說'是的',但我想聽聽你的專業意見。 – BillyJean 2013-04-10 13:12:03