В чем разница между классом Generator numpy .random и методами np.random? - PullRequest
1 голос
/ 09 марта 2020

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

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

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

np.random.randint(10)

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

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

1 Ответ

2 голосов
/ 10 марта 2020
Функции

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...