Spec-Zone.ru › NumPy 2.0

Генераторы случайных битов

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

Поддерживаемые генераторы случайных битов

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

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

BitGenerator([seed])

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

  • MT19937
  • PCG64
  • PCG64DXSM
  • Philox
  • SFC64

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

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

Если вам нужно запустить несколько стохастических симуляций параллельно, лучшей практикой является создание экземпляра генератора случайных чисел для каждой симуляции. Чтобы убедиться, что потоки случайных чисел имеют отличные начальные состояния, вы можете использовать метод 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]

Если у вас уже есть начальный экземпляр генератора случайных чисел, вы можете сократить вышеперечисленное, используя метод spawn:

from numpy.random import PCG64, SeedSequence
# High quality initial entropy
entropy = 0x87351080e25cb0fad77a44a3be03b491
base_bitgen = PCG64(entropy)
generators = base_bitgen.spawn(12)

Альтернативный способ — использовать тот факт, что 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 смешивает источники энтропии воспроизводимым способом, чтобы установить начальное состояние для независимых и, очень вероятно, не перекрывающихся генераторов случайных битов.

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

Spec-Zone.ru

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