在Python 2 documentation of the random.seed()
函数中,我发现了一个警告:
如果给出可清洗对象,则仅确保确定性结果 当PYTHONHASHSEED被禁用时。
从https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHASHSEED我推断,解释器的-R
开关可能与PYTHONHASHSEED
具有相似的效果。
我已经凭经验证实,用小整数播种的随机数似乎是可重现的。所以做小整数的哈希。
但是,int
是可以播放的。是否在任何可靠来源中明确说明,将其用作可重现的随机数序列的种子是安全的?
与Reproducibility of python pseudo-random numbers across systems and versions?相比,同一系统和解释器内的再现性就足够了。
答案 0 :(得分:3)
不是一个完整的答案,但random_seed
(in C)的源代码将是相关的:
if (PyInt_Check(arg) || PyLong_Check(arg))
n = PyNumber_Absolute(arg);
else {
long hash = PyObject_Hash(arg);
if (hash == -1)
goto Done;
n = PyLong_FromUnsignedLong((unsigned long)hash);
}
这表明除long
(int)之外的任何其他内容都直接使用哈希值作为种子,因此只要:
hash(int)
提供一致的结果和然后我希望seed(int)
能够产生一致的结果。
那说我不能说任何一个保持不变的条件,所以除非有其他人可以验证,否则这并没有给出明确的答案。
答案 1 :(得分:0)
文档证实了它在Python 2.6中的安全性:
如果x不是None或者是int或long,则使用hash(x)代替。如果x是int或long,则直接使用x。
(来自https://docs.python.org/2.6/library/random.html#random.seed)
[编辑]
2.7的文档已更新为:
如果a不是None或int或long,则使用hash(a)代替。请注意,启用PYTHONHASHSEED时,某些类型的哈希值是不确定的。