作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一些看起来有点像这样的代码:
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 上同样良好地工作。
最佳答案
并行使用随机设备不是一个好主意。即使它被阻塞,您可能不会遇到重叠随机数流的问题,但您添加了一个额外的同步点。
您应该设置尽可能多的随机数引擎 (RNE),omp_get_num_threads()
。创建一个 RNE 的 std::vector 并将它们播种在程序的顺序部分中。对于播种,您可以使用随机设备和 std::seed_seq .
然后在每个线程中使用与线程号关联的 RNE,omp_get_thread_num()
。
永远不要使用随机设备来生成随机数,它的速度很慢,而且通常不会生成均匀分布的随机数!
根据您需要的随机数的质量,您可以使用预定义的随机数生成器之一。如果您正在进行蒙特卡洛模拟或密码学,请格外小心您选择的算法。
您可以在以下位置找到很多关于随机引擎的有用信息 https://en.cppreference.com/w/cpp/numeric/random .
关于c++ - std::random_device 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157381/
我是一名优秀的程序员,十分优秀!