2015-05-12 6 views
2

Я замечаю, что если я запустил PRNG Python с кортежем, я получаю разные результаты каждый раз, когда я это делаю. То есть программа Python 3.4:Посев PRNG Python с кортежем

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

печатает другое количество каждый раз, когда он запускается. Это потому, что взятое семя является id кортежа seed1, который отличается каждый раз?

Каков наилучший способ использования кортежа в качестве семени для PRNG, чтобы получить повторяющиеся результаты? Это просто random.seed(str(seed1))?

+0

Итак, вы хотите получить тот же результат каждый раз, когда вы вызываете случайное, а не случайный результат? – IanAuld

+0

@IanAuld, а не точно: каждый раз, когда я запускаю указанную выше программу, я хочу получить тот же результат; то есть, я хочу, чтобы Python высевал свой Mersenne Twister с тем же целым значением, полученным из заданного кортежа. – xnx

+0

Возможно, это поможет: http://stackoverflow.com/questions/9023660/how-to-generate-a-repeatable-random-number-sequence – IanAuld

ответ

1

Из предыдущего question:

Для Python 3.3+, а @gnibbler отметил, хэш() рандомизированы между запусками. Он будет работать в течение одного прогона, но почти наверняка не будет работать через прогоны вашей программы (вытаскивая из упомянутого текстового файла).

Таким образом, используя 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 

то вы будете иметь последовательное семя, но поскольку случайные модули различаются по их реализации вы все равно получите другое случайное число.

+0

Спасибо: Я не против, если он нестабилен через Python 2/Python 3.4, но есть кое-что, что я не понимаю: 'random.seed (sha.hexdigest())' отправляет 'str' в' random.seed': как получается хэш, сгенерированный из этой 'str 'не рандомизирован в способе описания документов для Python 3.3+? – xnx

+1

@xnx Мне жаль, что у меня не было лучшего ответа (это хороший вопрос ИМХО). Подсказка заключается в помощи каждой функции в разных версиях. В python3 говорится: «Для версии 2 (по умолчанию) все биты используются, если * a * - это str, bytes или bytearray. Для версии 1 вместо этого используется hash() * a *." – Hooked

0

Интересно.

Если вы сделаете это:

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)) 

Вы получаете различные значения для случайных рядов каждый раз, когда вы запускаете его.

Если вы сделаете это:

def repeatable_random(seed): 
    random.seed(repr(seed))  # Note 'repr' here 
    while True: 
     yield random.random() 

for i, v in zip(range(20), repeatable_random(('Foo', 'Bar'))): 
    print((i,v)) 

Это та же серия 1 => п на разном пробеге интерпретатора Python.

Смежные вопросы