gpt4 book ai didi

c++ - std::random_device 的线程安全

转载 作者:IT老高 更新时间:2023-10-28 22:15:24 28 4
gpt4 key购买 nike

我有一些看起来有点像这样的代码:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com