首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多线程的随机数

多线程的随机数
EN

Stack Overflow用户
提问于 2013-02-17 17:31:26
回答 8查看 9.2K关注 0票数 24

问题

我打算为Linux编写一个C++11应用程序,它基于大约100万个伪随机32位数字进行一些数值模拟(而不是加密)。为了加快速度,我想使用桌面CPU的所有内核在并行线程中执行模拟。我想使用boost提供的Mersenne mt19937作为PRNG,而且出于性能考虑,我想每个线程应该有一个这样的PRNG。现在,我不确定如何为它们添加种子,以避免在多个线程中产生相同的随机数子序列。

备选方案

以下是我到目前为止所想到的其他选择:

  1. 为独立于/dev/urandom的每个线程设置PRNG种子。 当系统熵池耗尽时,我有点担心,因为我不知道系统内部PRNG是如何工作的。由于/dev/urandom使用的是Mersenne本身,我是否会意外地得到准确识别Mersenne的连续状态的连续种子?可能与我对下一点的担忧密切相关。
  2. /dev/urandom中培育一种PRNG,从第一种种开始另一种。 基本上也是同样的问题:使用一个PRNG来种子另一个使用相同的算法是好的还是坏的?换句话说,从mt19937读取625 32位整数是否直接对应于mt19937生成器在此生成过程中的任何时刻的内部状态?
  3. 用非Mersenne信息从一开始就给其他人播种。 由于使用相同的算法来生成随机数和生成初始种子,我觉得这可能是个坏主意,所以我考虑引入一些不依赖Mersenne算法的元素。例如,我可以将线程id异或到初始种子向量的每个元素中。这能让事情变得更好吗?
  4. 在线程间共享一个PRNG。 这将确保只有一个序列,所有已知的和可取的性质的默森扭曲。但控制对该生成器的访问所需的锁定开销确实让我有些担心。由于我没有发现相反的证据,我假设作为图书馆用户,我将负责防止并发访问PRNG。
  5. 预生成所有随机数。 这将使一个线程预先生成所有所需的1M随机数字,稍后将由不同的线程使用。与整个应用程序相比,4M的内存需求较小。在这种方法中,我最担心的是产生随机数本身并不是并发的。这种方法的规模也不太大。

问题

你会建议这些方法中的哪一种,为什么?还是你有不同的建议?

你知道我的哪些担忧是合理的,哪些仅仅是因为我缺乏对事物实际运作方式的洞察力?

EN

Stack Overflow用户

发布于 2013-03-13 11:36:00

有一个具体的实现(和发表的论文)关于使用Mersenne进行并行计算。它是由“机器翻译”的原始作者写的。他们把它称为“动态创造者”,在这里可以找到:

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html

这将是一个很好的地方来研究您的MT19937的具体用法,特别是论文那里。

票数 1
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14923902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档