【问题标题】:Reproducibility of python pseudo-random numbers across systems and versions?跨系统和版本的python伪随机数的再现性?
【发布时间】:2012-02-05 20:23:56
【问题描述】:

给定一个初始参数,我需要生成一个受控的伪随机数序列。为此,我使用了标准的 python 随机生成器,由这个参数播种。我想确保跨系统(操作系统,还有 Python 版本)生成相同的序列。

总结:python 是否确保它的伪随机数生成器在实现版本中的可重复性/可移植性?

【问题讨论】:

  • 旁白(只是出于兴趣):你为什么要这个?
  • 我需要在程序的两次运行中生成两个伪随机数序列,两个人可以在两台不同的机器上运行。它用于角色扮演游戏的伪密码“表格”生成器。别担心,这是游戏的密码学,它必须是可破译的:)
  • 我很久以前就被这个改变击中了(python 2.3)。但它被检测到了,因为我使用了一个小测试来检查随机模块创建的第一个数字。我建议您使用测试来检查第一个数字是否是您所期望的。

标签: python random portability


【解决方案1】:

不,它没有。 random module's documentation 中没有这样的承诺。

文档确实包含以下注释:

在 2.3 版中更改:MersenneTwister 将 Wichmann-Hill 替换为默认生成器

因此在 Python 2.3 之前使用了不同的 RNG。

到目前为止,我一直在使用 numpy.random.RandomState 来实现可重现的伪随机性,尽管它也没有做出您所追求的正式承诺。

如果您想要完全可重复性,您可能需要在您的程序中包含random 的源代码的副本,或者将来自hashlib 的“P²RNG”(伪伪RNG)组合在一起。

【讨论】:

    【解决方案2】:

    不一定。

    documentation 中所述,random 模块从 2.3 版本开始使用 Mersenne twister 生成随机数,但在此之前使用的是 Wichmann-Hill。

    (如果没有提供种子,获取种子的方式也确实取决于操作系统、Python版本、系统时间等因素)。

    【讨论】:

      【解决方案3】:

      提醒一下:除了 2.3 的更改之外,python 3 还提供了来自 randrange 的 python 2.x 中的数字以及可能的其他函数,即使来自 random.random 的数字相似。

      【讨论】:

      • 我发现相反。 random.random 在不同版本中产生了相同的数字,而 random.randrange 给出了不同的结果。
      【解决方案4】:

      @reubano - 3.2 随机更改了整数函数,以产生更均匀分布(这不可避免地意味着不同)的输出。

      Issue9025 讨论了该更改,团队讨论他们是否有义务坚持以前的输出,即使它有缺陷。他们得出结论,他们没有。 guarantee consistency 模块 random.random() 的文档 - 有人可能假设调用它的函数(如 random.randrange())隐含在该保证下,但这似乎不是情况。

      【讨论】:

        【解决方案5】:

        刚刚发现python3.7和python3.8也有区别。

        以下代码的行为相同

        from random import Random
        seed = 317
        rand = Random(seed)
        rand.getrandbits(64)
        

        但如果你改用from _random import Random,它的行为会有所不同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-01
          • 2019-11-30
          • 2010-10-29
          • 1970-01-01
          • 2021-11-30
          • 2017-10-22
          • 2021-01-26
          相关资源
          最近更新 更多