Python 来自单个种子的多个独立随机数流
我有Python 来自单个种子的多个独立随机数流,python,numpy,random,random-seed,Python,Numpy,Random,Random Seed,我有n类似的分析,每个分析都使用m_I伪随机数流(m_I可能会因分析而异)。每个分析都有其自己的随机数种子,因此分析之间的随机数不相关 我的问题是我需要从单个种子创建mi流。该分析目前是用Numpy编写的,因此其Mersenne Twister的解决方案是理想的,但我对其他成熟库中的解决方案持开放态度。我考虑了这些可能性: 使用种子创建随机数流,绘制m_i整数,并将这些整数用作m_i随机流的种子。这不好,因为。有(~40亿)个种子,但如果我在2^16(~60000)之后发生碰撞(两条流以相同的种
n
类似的分析,每个分析都使用m_I
伪随机数流(m_I
可能会因分析而异)。每个分析都有其自己的随机数种子,因此分析之间的随机数不相关
我的问题是我需要从单个种子创建mi
流。该分析目前是用Numpy编写的,因此其Mersenne Twister的解决方案是理想的,但我对其他成熟库中的解决方案持开放态度。我考虑了这些可能性:
m_i
整数,并将这些整数用作m_i
随机流的种子。这不好,因为。有(~40亿)个种子,但如果我在2^16(~60000)之后发生碰撞(两条流以相同的种子开始)m_max
,得到该流的种子。(例如,当seed=2
和m_max=10000
时,分析将使用种子20001、20002、20003等)。这是不可取的,因为在发生碰撞之前,所有分析都将限制在m_max
流中,如果m_max
太大,则分析数量将限制在2^32/m_max
有没有标准的方法可以做到这一点?方法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
,以绘制这些种子。)建议使用几种不同设计的PRNG
更新(2019年12月1日): 如果您使用的是NumPy,请注意,与此同时,NumPy 1.17引入了a;它使用了所谓的位生成器(如PCG)和随机生成器(如新的
NumPy.random.Generator
),这是a的结果。NumPy文档现在提供了关于和的详细信息。我还提供了关于多种子的一般信息“”中的ple进程(不特定于NumPy)