首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机数的可再现性(Python 2/随机)

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

Stack Overflow用户
提问于 2016-12-19 17:25:23
回答 2查看 363关注 0票数 2

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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时,某些类型的哈希值是不确定的。

票数 0
EN

Stack Overflow用户

发布于 2016-12-19 17:36:06

不是一个完整的答案,但是 (in C)的源代码是相关的:

代码语言:javascript
复制
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. 您正在使用seed的这个实现( Jython等可能不一样)。

那么,我希望seed(int)会产生一致的结果。

也就是说,我不能代表这些条件中的任何一个保持不变,所以这并不能给出一个明确的答案,除非其他人能够证实它们。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41227882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档