【问题标题】:Safe to seed Python RNG using float?使用浮点数安全地播种 Python RNG?
【发布时间】:2020-02-26 18:51:19
【问题描述】:

浮点值可以作为参数传递给 random.seed() 吗?这会带来不可预见的问题吗?

换句话说。是……

random.seed(0.99999999)
<use a few thousand random numbers>
random.seed(1)
<use a few thousand random numbers>

....在功能上等同于....

random.seed(0)
<use a few thousand random numbers>
random.seed(1)
<use a few thousand random numbers>

快速测试表明,两组代码都运行良好,并且从表面上看,输出似乎是独立且确定的。

我很想知道在种子集之间的独立性很重要的情况下,使用这种播种方法是否完全安全。获得确定性结果也很重要。我检查了一些文档:Python 2.7 documentationPython 3.8 documentation 并进行了一些谷歌搜索,只发现对用作种子的整数(或其他转换为整数的数据类型)的引用。我看不到对浮动的任何引用,这让我想知道它们是否“安全”,因为它们以可预测的方式工作,没有令人讨厌的意外。

我目前正在使用 Python 2.7,但我也对更现代版本的答案感兴趣。

【问题讨论】:

  • 它没有记录,所以你不应该依赖它。它可能只是像提到的其他类型一样将其转换为 int。
  • Gz 上 500k Barmar!

标签: python python-2.7 random


【解决方案1】:

使用浮点数作为种子是预期的功能:

支持的种子类型有:None、int、float、str、bytes 和 bytearray。

见:https://github.com/python/cpython/blob/master/Lib/random.py#L156

每次获得完全相同的浮点数对于获得相同的种子至关重要,但这并不太难。始终获得相同浮点值的最可靠方法是不对它进行任何计算,或接受任何用户输入。如果要确保完全控制,可以使用struct.unpack 从原始二进制数据生成浮点数。

【讨论】:

    【解决方案2】:

    是的,使用浮动种子是安全的

    根据the documentation,如果random.seed(a)intlong,则直接使用a,否则(如果a不是None)则使用hash(a)。鉴于 python 要求 hash(x) == hash(y) 如果 x == y,这意味着将为相等的浮点种子生成相同的伪随机数序列(带有关于浮点数严格比较的标准警告)。

    python 3 文档不太清楚它如何处理除intstrbytesbytearray 以外的类型的输入,但行为本身与 python 3.8 的 python 2 和早些时候。正如 Aaron 的回答中提到的,基于散列的种子在 3.9 中已弃用,但 float 仍然是受支持的种子类型。

    【讨论】:

    • hash(a) 的使用自 3.9 起折旧
    • @Aaron 谢谢,我将进行编辑以澄清我对 python 3 的了解仅限于
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多