【发布时间】:2017-06-28 16:24:11
【问题描述】:
我有一些看起来有点像这样的代码:
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。 -
random_device可能会被阻止。如果您想要的是并行性,那么这样使用它没有多大意义。您可以使用以random_device为种子的全局 PRNG 来为mt19937播种(但它需要显式锁定)。