Spec-Zone.ru › NumPy 1.21

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

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

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

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

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

BitGenerator([seed])

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

  • MT19937
  • PCG64
  • PCG64DXSM
  • Philox
  • SFC64

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

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

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

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

Если вам нужно запустить несколько стохастических симуляций параллельно, лучшей практикой является создание экземпляра генератора случайных чисел для каждой симуляции. Чтобы убедиться, что потоки случайных чисел имеют отличные начальные состояния, вы можете использовать метод spawn SeedSequence. Например, здесь мы создаём список из 12 экземпляров:

from numpy.random import PCG64, SeedSequence

# High quality initial entropy
entropy = 0x87351080e25cb0fad77a44a3be03b491
base_seq = SeedSequence(entropy)
child_seqs = base_seq.spawn(12)    # a list of 12 SeedSequences
generators = [PCG64(seq) for seq in child_seqs]

Альтернативный способ — использовать тот факт, что SeedSequence может быть инициализирован кортежем элементов. Здесь мы используем базовое значение энтропии и целое число worker_id

from numpy.random import PCG64, SeedSequence

# High quality initial entropy
entropy = 0x87351080e25cb0fad77a44a3be03b491
sequences = [SeedSequence((entropy, worker_id)) for worker_id in range(12)]
generators = [PCG64(seq) for seq in sequences]

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

SeedSequence([entropy, spawn_key, pool_size])

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

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

Spec-Zone.ru

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