Spec-Zone.ru › NumPy 1.20

Генераторы бит

Случайные значения, генерируемые Generator, берутся из объекта BitGenerator. BitGenerators не предоставляют непосредственно случайные числа, а содержат методы для инициализации, получения или установки состояния, перехода или продвижения состояния, а также для доступа к низкоуровневым оберткам для использования кодом, который может эффективно использовать предоставляемые функции, например, numba.

Поддерживаемые генераторы бит

Включенные генераторы бит:

  • PCG-64 - По умолчанию. Быстрый генератор, поддерживающий множество параллельных потоков и допускающий произвольное продвижение. См. документацию для advance. PCG-64 имеет период 2^{128}. Дополнительные сведения об этом классе ПСЧ см. на странице автора PCG http://www.pcg-random.org/.
  • MT19937 - Стандартный генератор бит Python. Добавляет функцию MT19937.jumped, которая возвращает новый генератор со состоянием, как если бы 2^{128} генераций были выполнены.
  • Philox - Генератор, основанный на счетчике, способный к произвольному продвижению или генерации независимых потоков. Более подробную информацию об этом классе генераторов бит см. на странице Random123.
  • SFC64 - Быстрый генератор, основанный на случайных обратимых отображениях. Обычно самый быстрый генератор из четырёх. Дополнительную (немного) информацию см. на странице автора SFC http://pracrand.sourceforge.net/RNG_engines.txt.

BitGenerator([seed])

Базовый класс для универсальных генераторов бит, которые предоставляют поток случайных бит на основе различных алгоритмов.

  • MT19937
  • PCG64
  • Philox
  • SFC64

Инициализация и энтропия

BitGenerator предоставляет поток случайных значений. Для генерации воспроизводимых потоков BitGenerators поддерживают установку начального состояния через seed. Все предоставленные BitGenerators принимают произвольное целое неотрицательное число или список таких чисел в качестве seed. BitGenerators должны обрабатывать эти входные данные, чтобы получить качественное внутреннее состояние для BitGenerator. Все генераторы бит в numpy делегируют эту задачу SeedSequence, которая использует методы хэширования для обеспечения того, что даже низкокачественные seed генерируют качественные начальные состояния.

from numpy.random import PCG64

bg = PCG64(12345678903141592653589793)

SeedSequence предназначена для удобства реализации лучших практик. Рекомендуется, чтобы стохастическая программа по умолчанию использовала энтропию из ОС, чтобы каждый запуск был другим. Программа должна выводить или регистрировать эту энтропию. Для воспроизведения предыдущего значения программа должна позволять пользователю предоставить это значение через какой-либо механизм, например, аргумент командной строки, чтобы пользователь мог повторно ввести эту энтропию для воспроизведения результата. SeedSequence может позаботиться обо всём, кроме взаимодействия с пользователем, что зависит от вас.

from numpy.random import PCG64, SeedSequence

# Get the user's seed somehow, maybe through `argparse`.
# If the user did not provide a seed, it should return `None`.
seed = get_user_seed()
ss = SeedSequence(seed)
print('seed = {}'.format(ss.entropy))
bg = PCG64(ss)

По умолчанию используется 128-битовое целое число с использованием энтропии, полученной из ОС. Это достаточный объём энтропии для инициализации всех генераторов в numpy. Не рекомендуется использовать небольшие seed менее 32 бит для общего использования. Использование только небольшого набора seed для инициализации более крупных пространств состояний означает, что некоторые начальные состояния невозможно достичь. Это создаёт некоторые смещения, если все используют такие значения.

В результатах не будет никаких ошибок, если брать в расчёт; даже seed равный 0 вполне допустимо, благодаря обработке, выполняемой SeedSequence. Если вам нужно некоторое фиксированное значение для модульных тестов или отладки, используйте любой seed, который вам нравится. Но если вы хотите делать выводы из результатов или публиковать их, использование большего набора seed — хорошая практика.

Если вам нужно сгенерировать хороший seed «оффлайн», то SeedSequence().entropy или использование secrets.randbits(128) из стандартной библиотеки являются удобными способами.

SeedSequence([entropy, spawn_key, pool_size])

SeedSequence смешивает источники энтропии воспроизводимым образом, чтобы установить начальное состояние для независимых и, очень вероятно, неперекрывающихся генераторов бит.

© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/random/bit_generators/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API