2

在函数的 Python 2 文档中,random.seed()我发现了一个警告:

如果给出了可散列对象,则只有在禁用 PYTHONHASHSEED 时才能确保确定性结果。

https://docs.python.org/2/using/cmdline.html#envvar-PYTHONHASHSEED我推断-R解释器的开关可能具有与PYTHONHASHSEED.

我已经根据经验验证,以小整数为种子的随机数似乎是可重现的。小整数的哈希也是如此。

但是,int是可散列的。是否在任何受信任的来源中明确指出,将其用作可重现的随机数序列的种子是安全的?

与跨系统和版本的 python 伪随机数的再现性相反?,在同一系统和解释器内的可重复性就足够了。

4

2 回答 2

3

random_seed不是一个完整的答案,但(在 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) 之外的任何东西都直接使用哈希值作为种子,只要:

  1. hash(int)给出一致的结果和
  2. 您正在使用种子的这个实现(对于 Jython 等可能不一样)

然后我希望seed(int)产生一致的结果。

也就是说,我不能说这些条件中的任何一个都保持不变,因此除非其他人可以验证它们,否则这并不能真正给出明确的答案。

于 2016-12-19T17:36:06.250 回答
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 时,某些类型的哈希值是不确定的。

于 2016-12-20T13:13:02.500 回答