我有一些代码,看起来有点像这样:线程安全:: 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