代码之家  ›  专栏  ›  技术社区  ›  Mark Amery Harley Holcombe

在同一程序中播种random和numpy.random的最佳实践

  •  1
  • Mark Amery Harley Holcombe  · 技术社区  · 6 年前

    为了使我们以后运行的随机模拟具有可复制性,我的同事和我经常明确地为 random numpy.random 使用 random.seed np.random.seed 方法。如果我们只是使用 但有时,我们同时使用这两个模块 随机的 np.random

    特别是,我担心我们可能会陷入某种陷阱,两个RNG一起以“非随机”的方式运行,例如 both generating the exact same sequence of random numbers ,或一个序列在另一个序列后面有几个值(例如,从 始终是来自的k+20数字 ),或两个序列以其他数学方式相互关联(我意识到伪随机数生成器都是对真实随机性的不完美模拟,但我希望避免因种子选择不当而加剧这种情况。)

    考虑到这一目标,我们是否应该或不应该以任何特定方式为这两个RNG播种?我曾经使用过,或者看到同事们使用过一些不同的策略,比如:

    • random.seed(42)
      np.random.seed(42)
      
    • 使用两个不同的任意种子:

      random.seed(271828)
      np.random.seed(314159)
      
    • 使用一个RNG中的随机数为另一个RNG播种:

      random.seed(42)
      np.random.seed(random.randint(0, 2**32))
      

    ... 我从来没有 注意到 这些方法的任何奇怪结果。。。但也许我只是错过了他们。有没有官方认可的方法?在代码审查中,是否有任何可能的陷阱我可以发现并提出警告?

    0 回复  |  直到 6 年前
        1
  •  4
  •   Peter O. Manuel Pinto    5 年前

    我将讨论关于如何为多个伪随机数生成器(PRNG)播种的一些指导原则。我假设您没有出于信息安全的目的使用随机行为数(如果是,则只有加密生成器才合适,此建议不适用)。

    • 为了降低相关伪随机数的风险,您可以使用PRNG算法,例如SFC和其他所谓的“基于计数器的”PRNG(Salmon等人,“并行随机数:简单到1、2、3”,2011),它们支持伪随机数的独立“流”。还有其他策略,我将在“中对此进行更多解释” Seeding Multiple Processes ".
    • SFC64 Parallel Random Number Generation “在NumPy文档中。
    • 您应该避免使用时间戳为PRNG(尤其是一次多个PRNG)设定种子。
    • 你提到 this question 在一篇评论中,当我开始写这个答案的时候。这里的建议是不要为同一种PRNG的多个实例播种种子。然而,如果种子被选择为彼此无关,或者如果使用具有非常大状态的PRNG(如Mersenne Twister)或为每个种子提供其自身非重叠伪随机数序列(如SFC)的PRNG,则此建议不太适用。这里(在撰写本文时)接受的答案演示了当.NET的多个实例 System.Random 系统。随机 对于PRNG来说,这是一个糟糕的选择,因为它只允许不超过32位长的种子(因此它可以产生的伪随机序列的数量是有限的),并且还因为它有实现错误(如果我理解正确的话),这些错误已经被保留下来以实现向后兼容性。
    推荐文章