用元组播种Python的PRNG

时间:2015-05-12 14:21:30

标签: python python-3.x random prng random-seed

我注意到如果我用一个元组为Python的PRNG播种,每次我都会得到不同的结果。也就是说,Python 3.4程序:

import random
seed1 = ('Foo', 'Bar')
random.seed(seed1)
print(random.random())

每次运行时都会输出不同的数字。这是因为所取的种子是元组id的{​​{1}},每次都不同吗?

使用元组作为PRNG种子的最佳方法是什么,以便获得可重复的结果?它只是seed1吗?

2 个答案:

答案 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。