Случайная выборка#
Быстрый старт#
The numpy.random модуль реализует генераторы псевдослучайных чисел (PRNGs или RNGs, сокращённо) с возможностью выборки из различных распределений вероятностей. В общем случае пользователи создадут Generator экземпляр
с default_rng и вызывать различные методы для получения выборок из
разных распределений.
>>> import numpy as np
>>> rng = np.random.default_rng()
Генерирует одно случайное число с плавающей точкой, равномерно распределенное в диапазоне \([0, 1)\):
>>> rng.random()
0.06369197489564249 # may vary
Сгенерируйте массив из 10 чисел в соответствии с единичным гауссовым распределением:
>>> rng.standard_normal(10)
array([-0.31018314, -1.8922078 , -0.3628523 , -0.63526532, 0.43181166, # may vary
0.51640373, 1.25693945, 0.07779185, 0.84090247, -2.13406828])
Сгенерировать массив из 5 целых чисел равномерно в диапазоне \([0, 10)\):
>>> rng.integers(low=0, high=10, size=5)
array([8, 7, 6, 2, 0]) # may vary
Наши ГСЧ являются детерминированными последовательностями и могут быть воспроизведены путем указания целого числа seed для
вывода его начального состояния. По умолчанию, без предоставления seed, default_rng будет инициализировать ГСЧ из недетерминированных данных операционной системы и, следовательно, генерировать разные числа каждый раз. Псевдослучайные последовательности будут независимыми для всех практических целей, по крайней мере, для тех целей, для которых наша псевдослучайность была хороша изначально.
>>> import numpy as np
>>> rng1 = np.random.default_rng()
>>> rng1.random()
0.6596288841243357 # may vary
>>> rng2 = np.random.default_rng()
>>> rng2.random()
0.11885628817151628 # may vary
Предупреждение
Псевдослучайные генераторы чисел, реализованные в этом модуле, предназначены
для статистического моделирования и симуляции. Они не подходят для целей безопасности
или криптографии. См. secrets модуль из
стандартной библиотеки для таких случаев использования.
Семена должны быть большими положительными целыми числами. default_rng может принимать положительные целые числа любого размера. Мы рекомендуем использовать очень большие уникальные числа, чтобы гарантировать, что ваше начальное значение отличается от чужого. Это хорошая практика для обеспечения статистической независимости ваших результатов от чужих, если только вы не намеренно пытаясь для воспроизведения их результата. Удобный способ получить такое начальное число — использовать secrets.randbits чтобы получить
произвольное 128-битное целое число.
>>> import numpy as np
>>> import secrets
>>> secrets.randbits(128)
122807528840384100672342137672332424406 # may vary
>>> rng1 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng1.random()
0.5363922081269535
>>> rng2 = np.random.default_rng(122807528840384100672342137672332424406)
>>> rng2.random()
0.5363922081269535
См. документацию по default_rng и SeedSequence для более продвинутых опций управления сидом в специализированных сценариях.
Generator и имеет тот же знак,
что и делитель RandomState и
функции в numpy.random. Хотя в настоящее время нет планов по их удалению, мы рекомендуем перейти на Generator насколько возможно. Алгоритмы быстрее, гибче и будут получать больше улучшений в будущем. В основном, Generator может использоваться в качестве замены для RandomState.
См. Устаревшая генерация случайных чисел для информации об устаревшей инфраструктуре,
Что нового или отличается для информации о переходе, и NEP 19 для части обоснования перехода.
Дизайн#
Пользователи в основном взаимодействуют с Generator экземпляры. Каждый Generator экземпляр
владеет BitGenerator экземпляр, реализующий основной алгоритм ГСЧ. The
BitGenerator имеет ограниченный набор обязанностей. Он управляет состоянием и предоставляет функции для генерации случайных чисел с плавающей запятой и случайных беззнаковых 32- и 64-битных значений.
The Generator берёт поток, предоставленный генератором битов, и преобразует их
в более полезные распределения, например, смоделированные нормальные случайные значения. Эта
структура позволяет использовать альтернативные генераторы битов с небольшим дублированием
кода.
NumPy реализует несколько различных BitGenerator классы, реализующие различные алгоритмы ГСЧ. default_rng в настоящее время использует PCG64 как значение
по умолчанию BitGenerator. Он имеет лучшие статистические свойства и производительность, чем MT19937 алгоритм, используемый в устаревшем RandomState. См.
Генераторы битов для получения дополнительных сведений о поддерживаемых генераторах битов.
default_rng и BitGenerators делегируют преобразование семян в состояния RNG SeedSequence внутренне. SeedSequence реализует сложный алгоритм, который выступает посредником между вводом пользователя и внутренними деталями реализации каждого BitGenerator алгоритм, каждый из которых может
требовать разное количество бит для своего состояния. Важно, что он позволяет использовать
целые числа произвольного размера и произвольные последовательности таких целых чисел для смешивания
в состояние ГСЧ. Это полезный примитив для построения
гибкий шаблон для параллельных потоков ГСЧ.
Для обратной совместимости мы всё ещё поддерживаем устаревший RandomState класс.
Он продолжает использовать MT19937 алгоритм по умолчанию, и старые сиды продолжают
воспроизводить те же результаты. Удобство Функции в numpy.random
всё ещё являются псевдонимами методов на едином глобальном RandomState экземпляр. См.
Устаревшая генерация случайных чисел для полных деталей. См. Что нового или отличается для подробного сравнения между Generator и RandomState.
Параллельная генерация#
Включённые генераторы можно использовать в параллельных, распределённых приложениях несколькими способами:
Пользователям с очень большим количеством параллелизма следует обратиться к Обновление PCG64 с PCG64DXSM.
Концепции#
Признаки#
Исходный источник генератора и бит-генераторов#
Этот пакет был разработан независимо от NumPy и интегрирован в версии 1.17.0. Исходный репозиторий находится по адресу bashtage/randomgen.