随机数的再现性(Python 2 /随机)

时间:2016-12-19 17:25:24

标签: python python-2.7 random deterministic reproducible-research

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?相比,同一系统和解释器内的再现性就足够了。

2 个答案:

答案 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)之外的任何其他内容都直接使用哈希值作为种子,因此只要:

  1. hash(int)提供一致的结果和
  2. 您正在使用此种子实现(对于Jython等可能不一样。)
  3. 然后我希望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时,某些类型的哈希值是不确定的。