我注意到如果我用一个元组为Python的PRNG播种,每次我都会得到不同的结果。也就是说,Python 3.4程序:
import random
seed1 = ('Foo', 'Bar')
random.seed(seed1)
print(random.random())
每次运行时都会输出不同的数字。这是因为所取的种子是元组id
的{{1}},每次都不同吗?
使用元组作为PRNG种子的最佳方法是什么,以便获得可重复的结果?它只是seed1
吗?
答案 0 :(得分:2)
来自之前的question:
对于Python 3.3+,正如@gnibbler所指出的,hash()在运行之间是随机的。它适用于单次运行,但几乎肯定不会在您的程序运行中工作(从您提到的文本文件中提取)。
因此,使用python 2.x,运行hash('Foo', 'Bar')
通常每次都会在同一台计算机上返回相同的结果,从而为您提供相同的初始种子。在python 3.3+上运行hash
对抗你的元组每次都会给你一个唯一的值。
如果你想使用python 3.3+获得一致的结果,请查看hashlib
。例如:
import hashlib
import random
seed1 = ('Foo', 'Bar')
text = u''.join(seed1).encode('utf-8')
sha = hashlib.sha1(text)
random.seed(sha.hexdigest())
print(sha.hexdigest())
print(random.random())
> python3 random2.py
eb8fc41f9d9ae5855c4d801355075e4ccfb22808
0.738130097774164
> python3 random2.py
eb8fc41f9d9ae5855c4d801355075e4ccfb22808
0.738130097774164
> python2 random2.py
eb8fc41f9d9ae5855c4d801355075e4ccfb22808
0.628422839243
> python2 random2.py
eb8fc41f9d9ae5855c4d801355075e4ccfb22808
0.628422839243
即。您将拥有一致的种子,但由于随机模块的实现方式不同,您仍会获得不同的随机数。
答案 1 :(得分:0)
有趣。
如果你这样做:
INDEX
每次运行随机序列时都会得到不同的值。
如果你这样做:
def repeatable_random(seed):
random.seed(seed)
while True:
yield random.random()
for i, v in zip(range(20), repeatable_random(('Foo', 'Bar'))):
print((i,v))
在Python解释器的不同运行中,它是相同的系列1 => n。