私は少しこのようになりますいくつかのコードがあります。スレッドセーフ:: 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
、スレッドセーフですか?つまり、複数のスレッドが同時に呼び出すときに何か役に立たないことをしていますか? - これは一般的には良い考えですか?乱数ストリームの重複が心配すべきでしょうか?
- 私は欲しいものを達成する良い方法がありますか(各スレッドの独立した乱数ストリーム - 私は現時点で再現性についてあまり心配していません)?
std::random_device
の動作に何らかの違いがある場合は、主にWindowsで動作していますが、LinuxとOSXでも同様に動作するようにしたいと思います。
'std :: random_device'を使うのではなく、特定のシードを使って再現性を達成できます。 – Galik
'random_device'がブロックされている可能性があります。あなたが望むものが並列性であれば、そのように使うことはそれほど重要ではありません。 'random_device'でシードされたグローバルPRNGを使って' mt19937'をシードすることができます(ただし、明示的なロックが必要です)。 – sbabbi