Numpy RNG недетерминированный, даже когда посеян
Я использую numpy.random для симуляции Монте-Карло, где возможны очень малые вероятности принятия / отклонения. Хотя я сею ГСЧ, я не могу воспроизвести ту же последовательность случайных чисел. В документации numpy 1.15.1 говорится:
Гарантия совместимости: фиксированное начальное число и фиксированная серия вызовов методов RandomState с использованием одинаковых параметров всегда будут давать одинаковые результаты вплоть до ошибки округления, за исключением случаев, когда значения были неправильными. Неправильные значения будут исправлены, а версия NumPy, в которой было сделано исправление, будет указана в соответствующей строке документации. Расширение существующих диапазонов параметров и добавление новых параметров разрешено, пока предыдущее поведение остается неизменным.
Прежде всего, что они подразумевают под неправильными значениями? Во-вторых, как обрабатывается ошибка округления? Разве значения не всегда округляются одинаково? Возможно ли вообще, что мой код не является полностью детерминированным, хотя я предоставляю начальное значение? Я уверен, что начальное значение больше нигде не сбрасывается, потому что я предоставляю свой объект RNG каждой функции в качестве аргумента.
Редактировать: Оказывается, я использую set() в моей симуляции. Я считаю, что именно здесь я теряю детерминизм.
1 ответ
Похоже, что я использовал наборы во всем коде и выбирал случайным образом из этих наборов, выбрасывая случайное число для выбора индекса элемента. Проблема заключалась в том, что наборы неупорядочены, а конкретный порядок наборов был неконтролируемым, поэтому случайным.