浮点值能否作为参数传递给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 documentation和Python 3.8 documentation,并在谷歌上搜索了一下,只找到了用作种子的整数(或转换为整数的其他数据类型)的引用。我看不到对浮动的任何引用,这让我怀疑它们是否“安全”,因为它们以可预测的方式工作,没有令人讨厌的意外
我目前正在使用Python2.7,但对更现代版本的答案也很感兴趣
是的,使用漂浮种子是安全的
根据the documentation,
random.seed(a)
如果是int
或long
,则直接使用a
,否则(如果a
不是None
),则使用hash(a)
。鉴于python要求hash(x) == hash(y)
如果x == y
,这意味着将为相等的浮点种子生成相同的伪随机数序列(关于严格比较浮点数的标准警告)python 3文档不太清楚它如何处理除
int
、str
、bytes
和bytearray
之外的其他类型的输入,但其行为本身与python 3.8及更早版本的python 2相同。正如Aaron在回答中提到的,3.9中不推荐基于哈希的种子设定,但是float
仍然是受支持的种子类型使用浮点作为种子是预期的功能:
见:https://github.com/python/cpython/blob/master/Lib/random.py#L156
每次获得完全相同的浮点值对于获得相同的种子至关重要,但这并不太困难。获得相同浮点值的最可靠方法是不对其进行任何计算,也不接受任何用户输入。如果要确保完全控制,可以使用^{} 从原始二进制数据生成浮点
相关问题 更多 >
编程相关推荐