我有一些代碼,看起來有點像這樣:線程安全:: random_device
std::random_device rd;
#pragma omp parallel
{
std::mt19937 gen(rd());
#pragma omp for
for(int i=0; i < N; i++)
{
/* Do stuff with random numbers from gen() */
}
}
我有幾個問題:
- 是
std::random_device
線程安全的?即當多個線程同時調用它時,它會做些什麼沒有幫助的事情? - 這通常是一個好主意嗎?我應該擔心重疊的隨機數字流嗎?
- 有沒有更好的方法來實現我想要的(每個線程中獨立的隨機數字流 - 我現在不擔心重複性)?
如果它做出我主要在Windows上運行的std::random_device
運作有什麼區別,不過我想代碼在Linux和OSX同樣出色的工作爲好。
您可以實現再現性,但使用特定的種子而不是使用'std :: random_device'。 – Galik
'random_device'很可能被阻塞。如果你想要的是並行性,那麼使用它就沒有多少意義。你可以使用一個用'random_device'播種的全局PRNG來播種'mt19937'(但它需要明確的鎖定)。 – sbabbi