我有一些代码,看起来有点像这样:
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
来实现可重复性。 - Galikrandom_device
很可能会阻塞。如果你想要并行性,那么这样使用它就没有太多意义了。你可以使用一个全局 PRNG 来种子化mt19937
,种子值来自于random_device
(但是需要显式锁定)。 - sbabbi