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

  • 使用seed创建一个随机数流,根据需要为每个流绘制32位,并将每个流的值转换为为为其绘制的624个整数。这似乎很完美,只是我不知道624个随机整数是否真的是Mersenne Twister的有效内部状态(可以是任意位吗?)。我也不知道这些整数之间是否有任何隐藏的相关性(可能它们是同一个流,只移动了624)


  • 有没有标准的方法可以做到这一点?

    方法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)