问题
我打算为Linux编写一个C++11应用程序,它基于大约100万个伪随机32位数字进行一些数值模拟(而不是加密)。为了加快速度,我想使用桌面CPU的所有内核在并行线程中执行模拟。我想使用boost提供的Mersenne mt19937作为PRNG,而且出于性能考虑,我想每个线程应该有一个这样的PRNG。现在,我不确定如何为它们添加种子,以避免在多个线程中产生相同的随机数子序列。
备选方案
以下是我到目前为止所想到的其他选择:
/dev/urandom的每个线程设置PRNG种子。
当系统熵池耗尽时,我有点担心,因为我不知道系统内部PRNG是如何工作的。由于/dev/urandom使用的是Mersenne本身,我是否会意外地得到准确识别Mersenne的连续状态的连续种子?可能与我对下一点的担忧密切相关。/dev/urandom中培育一种PRNG,从第一种种开始另一种。
基本上也是同样的问题:使用一个PRNG来种子另一个使用相同的算法是好的还是坏的?换句话说,从mt19937读取625 32位整数是否直接对应于mt19937生成器在此生成过程中的任何时刻的内部状态?问题
你会建议这些方法中的哪一种,为什么?还是你有不同的建议?
你知道我的哪些担忧是合理的,哪些仅仅是因为我缺乏对事物实际运作方式的洞察力?
发布于 2013-03-13 11:36:00
有一个具体的实现(和发表的论文)关于使用Mersenne进行并行计算。它是由“机器翻译”的原始作者写的。他们把它称为“动态创造者”,在这里可以找到:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/DC/dc.html
这将是一个很好的地方来研究您的MT19937的具体用法,特别是论文那里。
https://stackoverflow.com/questions/14923902
复制相似问题