使用float安全地为Python RNG种子?

2024-05-16 06:22:21 发布

您现在位置:Python中文网/ 问答频道 /正文

浮点值能否作为参数传递给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,并在谷歌上搜索了一下,只找到了用作种子的整数(或转换为整数的其他数据类型)的引用。我看不到对浮动的任何引用,这让我怀疑它们是否“安全”,因为它们以可预测的方式工作,没有令人讨厌的意外

我目前正在使用Python2.7,但对更现代版本的答案也很感兴趣


Tags: 功能usedocumentation整数random种子表面seed
2条回答

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

根据the documentationrandom.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仍然是受支持的种子类型

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

supported seed types are: None, int, float, str, bytes, and bytearray.

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

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

相关问题 更多 >