【问题标题】:Multiple independent random number streams from single seed来自单个种子的多个独立随机数流
【发布时间】:2019-04-06 22:49:18
【问题描述】:

我有 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 以获取该流的种子。(例如,使用 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)。

有这样做的标准方法吗?

【问题讨论】:

    标签: python numpy random random-seed


    【解决方案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,来绘制这些种子。)@ 987654321@ 推荐了几种不同设计的 PRNG。


    更新(2019 年 12 月 1 日):

    如果您使用的是 NumPy,请注意与此同时,NumPy 1.17 引入了new random number generation system;它使用所谓的bit generators,例如PCG,以及random generators,例如新的numpy.random.Generator。这是proposal to change the RNG policy 的结果。 NumPy 文档现在包含有关 seeding RNGs in parallelmultithreading RNGs 的详细信息。我还有关于在“Seed Generation for Noncryptographic PRNGs”中播种多个进程(非 NumPy 特定)的一般信息。

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多