Spec-Zone.ru › NumPy 1.18

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

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

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

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

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

BitGenerator([seed])

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

  • MT19937
  • PCG64
  • Philox
  • SFC64

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

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

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. Не рекомендуется использовать небольшие начальные значения ниже 32 бит для общего использования. Использование небольшого набора начальных значений для инициализации больших пространств состояний означает, что некоторые начальные состояния невозможно достичь. Это создаёт некоторые смещения, если все используют такие значения.

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

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

SeedSequence([entropy, spawn_key, pool_size])

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

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

Spec-Zone.ru

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