В чем разница между классом генератора numpy.random и методами np.random?

Я некоторое время использовал случайную функциональность numpy, вызывая такие методы, как np.random.choice() или np.random.randint() и т. д. Я только что узнал о возможности создания объекта default_rng или других Generator:

from numpy.random import default_rng
gen = default_rng()
random_number = gen.integers(10)

До сих пор я всегда использовал

np.random.randint(10)

вместо этого, и мне интересно, в чем разница между обоими способами.

Единственным преимуществом, о котором я могу думать, было бы отслеживание нескольких семян или желание использовать определенные PRNG, но, возможно, есть также различия для более общего варианта использования?


person Johannes Ackermann    schedule 09.03.2020    source источник
comment
randint и другие функции np.random теперь устарели в пользу генераторов. Возможность использовать несколько независимых потоков случайных чисел является одним из их преимуществ, но генераторы также позволяют вам выбирать между различными алгоритмы генератора битов или даже реализовать свои собственные, что делает его более гибким и может упростить воспроизводимость.   -  person jdehesa    schedule 09.03.2020
comment
Аргументы воспроизводимости и гибкости имеют смысл, хотя я полагаю, что написание собственного битового генератора в основном ограничено криптографическим приложением?   -  person Johannes Ackermann    schedule 09.03.2020
comment
Да, я бы сказал, что это ограничено очень конкретными приложениями, исследованиями/исследованиями или конкретными случаями, когда вы пытаетесь точно соответствовать поведению какой-либо другой части программного обеспечения.   -  person jdehesa    schedule 09.03.2020
comment
Отвечает ли это на ваш вопрос? Как использовать numpy.random генерировать случайные числа из определенного распределения?   -  person Peter O.    schedule 09.03.2020
comment
@ПитерО. Не совсем, я понимаю использование, мне было интересно, есть ли какие-то основные различия, о которых я должен знать. Или были ли какие-то неочевидные преимущества от перехода на новый интерфейс и т.д.   -  person Johannes Ackermann    schedule 09.03.2020


Ответы (1)


Функции numpy.random.* (включая numpy.random.binomial) используют глобальный объект генератора случайных чисел, который является общим для всего приложения. С другой стороны, default_rng() — это автономный объект-генератор, который не зависит от глобального состояния.

Если вас не волнует воспроизводимая «случайность» в вашем приложении, эти два подхода на данный момент эквивалентны. Хотя новая политика RNG NumPy не рекомендует использовать глобальное состояние в целом, оно не объявляет устаревшими какие-либо функции numpy.random.* в версии 1.17, хотя в будущей версии NumPy это может быть возможно.

Также обратите внимание, что, поскольку функции numpy.random.* полагаются на глобальный объект генератора случайных чисел, который не является потокобезопасным, эти функции может вызвать состояние гонки, если ваше приложение использует несколько потоков. (Объекты Generator также не являются потокобезопасными, но есть способы генерировать случайные числа с помощью многопоточности без необходимости совместного использования объектов генератора случайных чисел между потоками.)

person Peter O.    schedule 09.03.2020