代码之家  ›  专栏  ›  技术社区  ›  drhagen

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

  •  1
  • drhagen  · 技术社区  · 7 年前

    我有 n 每次使用类似的分析 m_i 伪随机数流( 穆伊 可能因分析而异)。每个分析都有自己的随机数种子,因此分析之间的随机数是不相关的。

    我的问题是我需要创造 穆伊 从一粒种子流出。该分析目前是用Numpy编写的,因此其Mersenne Twister的解决方案是理想的,但我对其他成熟库中的解决方案持开放态度。我考虑了这些可能性:

    1. 使用种子创建随机数流,绘制 穆伊 整数,并将这些整数用作 穆伊 随机流。 这不好,因为 birthday paradox . 有 2^32 (大约40亿)个种子,但是如果我在2^16(~60000)之后发生碰撞(两条流从同一个种子开始)。

    2. 把种子乘以某个常数 m_max 为每个流索引1以获取该流的种子。 (例如 seed=2 和 m_max=10000 ,分析将使用种子20001、20002、20003等)。这是不可取的,因为所有的分析将限于 最大值 在发生碰撞之前,如果 最大值 太大了,分析的次数限制在 2^32/m_max .

    3. 使用种子创建随机数流,绘制 624 32位 integers 根据所需的流,以及 set the state 每个流的624个整数。 这看起来很完美,只是我不知道624个随机整数是否是Mersenne Twister的有效内部状态(它可以是任意位吗?)。我也不知道整数之间是否有任何隐藏的关联(可能它们是刚刚移位624的同一个流)。

    有标准的方法吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Peter O. Manuel Pinto    6 年前

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


    更新(2019年12月1日):

    如果您使用的是NumPy,请注意,在此期间,NumPy 1.17引入了 new random number generation system ;它使用所谓的 位生成器 ,例如PCG,以及 随机发生器 ,例如新的 numpy.random.Generator . 这是一个 proposal to change the RNG policy . NumPy文档现在有关于 seeding RNGs in parallel ,和 multithreading RNGs . 我也有关于在中植入多个进程(不是特定于NumPy)的一般信息。” Seed Generation for Noncryptographic PRNGs ."

    推荐文章