在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?相比,同一系统和解释器内的可再现性就足够了。
发布于 2016-12-20 13:13:02
这些文档在Python2.6中确认了它的安全性:
如果x不是None或int或long,则使用散列(X)。如果x是int或long,则直接使用x。
(来自https://docs.python.org/2.6/library/random.html#random.seed)
编辑
2.7份文件已更新如下:
如果a不是None、int或long,则使用散列(A)。注意,当启用PYTHONHASHSEED时,某些类型的哈希值是不确定的。
发布于 2016-12-19 17:36:06
不是一个完整的答案,但是 (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)会产生一致的结果。
也就是说,我不能代表这些条件中的任何一个保持不变,所以这并不能给出一个明确的答案,除非其他人能够证实它们。
https://stackoverflow.com/questions/41227882
复制相似问题