2013-04-25 5 views
3

У нас есть очень простая программа (однопоточная), где мы делаем кучу случайных выборок. Для этого мы используем несколько вызовов случайных функций numpy (например, normal или random_sample). Иногда результат одного случайного вызова определяет количество раз, когда вызывается другая случайная функция.Python numpy - Воспроизводимость случайных чисел

Теперь я хочу установить семя в начале с. несколько прогонов моей программы должны давать одинаковый результат. Для этого я использую экземпляр класса numpyRandomState. Хотя это так в начале, в какой-то момент результаты становятся разными, и именно поэтому мне интересно.

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

+10

Показать нас * код *! Без минимального примера, демонстрирующего вашу проблему, маловероятно, что мы можем быть полезны! – Bakuriu

+2

Вы не делаете это правильно. Известно, что PRNG в numpy хороши. Если вы хотите, чтобы мы вам поверили, предоставьте программу, которая семена PRNG, а затем произведет различный вывод на разных тиражах. В противном случае этого не произошло. –

ответ

4

Хорошо, Дэвид был прав. PRNG в numpy работают правильно. На каждом минимальном примере, который я создал, они работали так, как они должны.

Моя проблема была другая, но, наконец, я решил ее. Никогда не перебирайте словарь в детерминированном алгоритме. Кажется, что Python упорядочивает элементы произвольно при вызове функции .item() для получения итератора.

Так что я не разочарован тем, что это была такая ошибка, потому что это полезное напоминание о том, что нужно думать при попытке воспроизвести воспроизводимые симуляции.

-1

Если воспроизводимость очень важна для вас, я не уверен, что полностью доверяю любому PRNG, чтобы всегда производить один и тот же результат с одним и тем же семенем. Вы можете рассмотреть возможность захвата случайных чисел в одну фазу, сохраняя их для повторного использования; затем на втором этапе воспроизведите случайные числа, которые вы захватили. Это единственный способ устранить возможность невоспроизводимости - и он также решает вашу текущую проблему.

+1

Если PRNG не производит одинаковый выход для одного и того же семени, он сломан. –

+1

Правильно, но на самом деле его можно сломать. Или он не может последовательно перемещаться между ОС. Или это может иметь разные результаты в Python 3. Или или или. Я хочу сказать, что если повторяемость важна, вы можете гарантировать ее с помощью метода записи и воспроизведения. –

+1

PRNG, как известно, хорош, и нет никаких предположений, что это что-то другое, кроме одной версии Python, одной машины. –

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