Как указать генератор случайных чисел в numpy

Я создаю симуляцию Монте-Карло с использованием python и до сих пор использовал numpy для генерации моих случайных переменных. Однако я только что узнал, что numpy использует алгоритм Mersenne Twister для создания своих случайных чисел, что, исходя из моего ограниченного понимания, нежелательно в симуляциях Монте-Карло. Я бы предпочел использовать MRG32k3a, но я также хотел бы воспользоваться функциями распределения numpy. Есть ли способ заставить numpy использовать генератор по моему выбору или есть другая библиотека, которая даст мне ту же функциональность с возможностью использования моего предпочтительного генератора?


person Nathan Geldner    schedule 30.01.2019    source источник
comment
Может быть, взгляните на этот pypi.org/project/randomstate , там написано, что он включает MRG32k3a   -  person Kays Kadhi    schedule 30.01.2019
comment
which based on my limited understanding is not desireable in monte carlo simulations не знаю, почему вы думаете, что это правда. MT вполне подходит для многих применений. В любом случае, если вам нужна альтернатива, взгляните на github.com/bashtage/randomgen.   -  person Severin Pappadeux    schedule 31.01.2019
comment
Спасибо вам обоим за вашу помощь. Северин, это исходит от инструктора курса, который я прохожу по моделированию методом Монте-Карло (моделирование, которое я создаю, предназначено для несвязанного проекта), который сказал в классе, что машинный перевод хорош для большинства целей, но может не работать для моделирования методом Монте-Карло. конкретно. Страница в Википедии поддерживает этот en.wikipedia.org/wiki/Mersenne_Twister#cite_note-39 и хотя кажется, что есть способы обойти возникающие проблемы, мне не ясно, что numpy автоматически использует эти обходные пути, поэтому замена вставки кажется наиболее простым путем.   -  person Nathan Geldner    schedule 01.02.2019
comment
@KaysKadhi Пожалуйста, отправьте это как лучший ответ, если он действительно работает для ОП?   -  person jtlz2    schedule 25.03.2019


Ответы (1)


Почему бы вам не закодировать это самостоятельно на питоне?

Я нашел пример реализации алгоритма по адресу http://simul.iro.umontreal.ca/rng/MRG32k3a.c (со многими другими на http://www-labs.iro.umonreal.ca/~simul/rng)

Если вы беспокоитесь о скорости (но сначала профилируйте ее!), вы можете обернуть код C или F и вызвать его непосредственно из python, используя, например, CFFI, f2py и т. д. - см., например.

https://scipy-lectures.org/advanced/interfacing_with_c/interfacing_with_c.html

Но, учитывая, что это всего несколько строк кода на C, это не должно быть слишком сложно на Python, верно?

Вы также можете отправить запрос на вытягивание по адресу https://github.com/bashtage/randomgen (или спросить автору приятно включить выбранный вами генератор).

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

Также, возможно, выясните, почему Mersenne не годится для ваших собственных целей - проверяли ли вы его и какие показатели качества вы используете для принятия решения?

https://scicomp.stackexchange.com/questions/23547/parallel-mersenne-twister-for-monte-carlo может оказаться полезным для вас.

Можете ли вы сделать какие-либо предварительные вычисления?

Надеюсь, это хоть немного поможет.

person jtlz2    schedule 25.03.2019