单个种子生成多个独立随机数流

4

我有n个类似的分析,每个分析使用m_i个伪随机数流(m_i在分析之间可能会有所不同)。每个分析都有自己的随机数种子,以使随机数在分析之间不相关。

我的问题是,我需要从单个种子创建m_i个流。该分析当前使用Numpy编写,因此其Mersenne Twister的解决方案是理想的,但我也可以接受其他成熟库的解决方案。我考虑了以下可能性:

  1. 使用种子创建一个随机数流,绘制 m_i 个整数,并使用这些整数作为 m_i 个随机流的种子。 这样做不好,因为存在生日悖论。有 2^32 (~40亿) 种子,但如果我在 2^16 (~60000) 次后遇到冲突(两个以相同种子开始的流),则会出现冲突。

  2. 将种子乘以某个常数 m_max,每个流索引加 1,以获得该流的种子。 (例如,对于 seed=2m_max=10000,分析将使用种子 20001、20002、20003 等)。这不是理想的方法,因为所有分析都将仅限于 m_max 个流,然后就会出现冲突;如果 m_max 太大,则分析数量将限制为 2^32/m_max

  3. 使用种子创建一个随机数流,每个所需的流绘制 624 个32位integers,并将每个流的状态设置为为其绘制的624个整数。 这似乎是完美的,但我不知道624个随机整数是否实际上是Mersenne Twister的有效内部状态(是否可以是任意位?)。我也不知道整数之间是否存在任何隐藏的相关性(也许它们是同一流只是被移动了624个位置)。

有标准的做法吗?

1个回答

3

第三种方法可行,因为任何伪随机数生成器的种子长度都可以与该伪随机数生成器的状态一样长(例如,Mersenne Twister的状态长度为19968位,或624 * 32位,因此可以接受多达那么多位的种子 - 它不像许多实现Mersenne Twister的API一样被限制在32位或64位)。但是,您应该使用与Mersenne Twister无关的设计的PRNG(例如PCG)来作为该PRNG的种子,然后按照您建议的方式绘制624个整数种子。(或者,如果您不需要可重复的结果,或者如果您将保存通过此方式生成的624个整数种子,则可以使用加密RNG,例如os.urandom()secrets.SystemRandom来绘制这些种子。)我的RNG文章提供了几种具有不同设计的PRNG。


更新(2019年12月1日):

如果您正在使用NumPy,请注意,与此同时,NumPy 1.17引入了新的随机数生成系统;它使用所谓的比特生成器(如PCG),以及随机生成器(如新的numpy.random.Generator)。这是一个改变RNG策略的建议的结果。 NumPy文档现在提供了有关并行种子生成多线程RNGs的详细信息。我还在“非加密PRNG的种子生成”中提供了关于种植多个进程(不特定于NumPy)的一般信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接