2

В Python 2 documentation of the random.seed() функции я нашел предупреждение:Воспроизводимость случайных чисел (Python 2/случайный)

Если hashable объект задан, детерминированные результаты только уверены когда 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

Я считаю, что недостаток документации; он должен сказать, что ints и longs не хэшируются. В любом случае реализация Python 2 вряд ли изменится на данный момент, а в [документации Python 3] (https://docs.python.org/3/library/random.html#random.seed) упоминается, что ints (Python 2) используются напрямую. – user2357112

ответ

0

документация подтверждает свою безопасность в Python 2.6:

Если х не является None или INT или длинный, хэш (х) используется вместо этого. Если x является int или long, x используется напрямую.

(от https://docs.python.org/2.6/library/random.html#random.seed)

[EDIT]

Документация 2.7 была обновлена:

Если не является None или INT или долго, то хэш (а). Обратите внимание, что значения хеша для некоторых типов являются недетерминированными, когда включена функция 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 ok, но другие, но проверяющие, является ли это 'int' или' long', а не просто 'long', соответствующие части почти одинаковы? –

+0

@ TadhgMcDonald-Jensen Я согласен с user2357112. Речь идет не о разности 'int' /' long'. Вопрос был о Python 2 специально, поэтому исходный код Python 2.7 кажется более подходящим – abukaj

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