2016-11-03 6 views
2

Из инструкции:питон случайных высева является детерминированным, но это не должно быть

random.seed ([х])

Инициализировать основной генератор случайных чисел. Дополнительный аргумент x может быть любым хешируемым объектом. Если x опущено или Нет, используется текущее системное время; текущее системное время также используется для инициализировать генератор, когда модуль сначала импортируется. Если источников случайности предоставлены операционной системой, они используются вместо вместо системного времени (см. Функцию os.urandom() для получения подробной информации о наличии).

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

[email protected]:~$ python 
Python 2.7.11 (default, Aug 6 2016, 02:11:50) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random 
>>> r = random.Random('somelongstring' * 40) 
>>> r.randint(1, 1000) 
332 
>>> exit() 

[email protected]:~$ python 
Python 2.7.11 (default, Aug 6 2016, 02:11:50) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import random 
>>> r = random.Random('somelongstring' * 40) 
>>> r.randint(1, 1000) 
332 
>>> 

Беда в том, что я пытаюсь получить тот же результат каждый раз, но в соответствии с инструкцией и PYTHONHASHSEED, я shoundn't получать те же результаты каждый раз. Я пробовал это на mac os, linux, python2.7 и pypy, и они повторяют одни и те же результаты снова и снова.

ответ

5

Значение по умолчанию для PYTHONHASHSEED должно быть отключено; в Python 2 нет случайного хеширования, если вы явно не включили его. Он был намеренно оставлен необязательным в Python 2, чтобы не нарушать приложения, которые полагались на хеш-стабильность в процессах Python, и он был сделан только по умолчанию для Python 3.

Если вы включили его (с помощью -R command line switch или с помощью переменная окружения) того вы действительно увидите разницу:

$ python2.7 -R -c "import random; random.seed('somelongstring' * 40); print random.randint(1, 1000)" 
955 
$ python2.7 -R -c "import random; random.seed('somelongstring' * 40); print random.randint(1, 1000)" 
277 

Из документации -R переключателя:

Изменения значений хэша влияет на порядок, в котором ключи повторно извергнут из диктата. Хотя Python никогда не предоставлял гарантии об этом заказе (и обычно он варьируется между 32-битными и 64-битными сборками), достаточно кода реального мира неявно полагается на это не гарантированное поведение, которое рандомизация отключена по умолчанию.

Python 3 также изменили str, используются bytes и bytearray объектов; они сообщают семена без, используя свой хеш.

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