来自单个种子的多个独立随机数流

时间:2018-11-02 16:55:05

标签: python numpy random random-seed

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

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

  1. 使用种子创建随机数流,绘制m_i整数,并将这些整数用作m_i随机流的种子。因为birthday paradox很好。有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,每个流set the state绘制为624个整数这似乎是完美的,除了我不知道624个随机整数对于Mersenne Twister是否实际上是有效的内部状态(可以是任意位吗?)。我也不知道这些整数之间是否存在任何隐藏的相关性(也许它们只是在624处移动了相同的流)。

是否有标准的方法?

1 个答案:

答案 0 :(得分:1)

方法3可以正常工作,因为任何PRNG的种子可以与PRNG的状态一样长(例如,Mersenne Twister的状态长度为19968位,即624 * 32位,因此可以接受以下种子:那么多的位-不限于32位或64位,这是许多实现Mersenne Twister的API的做法。但是,您应该使用与Mersenne Twister无关的PRNG,例如PCG,为该PRNG注入种子,然后根据您的建议绘制624整数种子。 (或者,如果您不需要可重复的结果,或者如果您将保存以此方式生成的624个整数种子,则可以使用加密的RNG(例如os.urandom()secrets.SystemRandom来绘制这些种子) My article on RNGs建议使用几种不同设计的PRNG。