2

Python 2 documentation of the random.seed()功能的我發現了一個警告:再現隨機數(Python的2 /隨機)

如果哈希的對象給出的,確定性的結果僅保證 當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

我會考慮一個文檔缺陷;應該說,整數和長整數不會被散列。無論如何,Python 2的實現在這一點上不太可能改變,並且[Python 3文檔](https://docs.python.org/3/library/random.html#random.seed)提到了int( Python 2 longs)直接使用。 – user2357112

回答

0

文檔確認其在Python 2.6安全:

如果x不是無或一個int或長,散列(x)被用來代替。如果x是一個int或long,則直接使用x。

(從https://docs.python.org/2.6/library/random.html#random.seed

[編輯]

爲2.7的文檔已經被更新爲:

如果不是無或int或長,則散列(a)代替。請注意,啓用PYTHONHASHSEED時,某些類型的散列值不確定。

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等相同)

然後,我期望seed(int)產生一致的結果。

這就是說,我不能說這些條件保持不變,所以這並沒有真正給出明確的答案,除非別人能夠驗證它們。

+1

看起來像Python 3的源代碼。 [Python 2代碼](https://hg.python.org/cpython/file/2.7/Modules/_randommodule.c#l231)會更相關。 – user2357112

+0

@ user2357112確定但其他然後檢查它是否是一個'int'或'long'而不是'只有'相關的部分幾乎是一樣的不是? –

+0

@ TadhgMcDonald-Jensen我同意user2357112。這不是關於'int'/'long'的區別。這個問題是關於Python 2的,因此Python 2.7源代碼似乎更合適 – abukaj