Генераторы бит
Случайные значения, генерируемые Generator, берутся из Генератора бит. Генераторы бит не предоставляют случайные числа напрямую и содержат только методы, используемые для инициализации, получения или установки состояния, перехода или продвижения состояния, а также для доступа к низкоуровневым обёрткам для использования кодом, который может эффективно получать доступ к предоставляемым функциям, например, numba.
Поддерживаемые генераторы бит
Включённые генераторы бит:
- PCG-64 — По умолчанию. Быстрый генератор, поддерживающий множество параллельных потоков и допускающий произвольное продвижение. См. документацию для
advance. PCG-64 имеет период. Для получения дополнительной информации об этом классе ПГС см. страницу автора PCG .
- MT19937 — Стандартный генератор бит Python. Добавляет функцию
MT19937.jumped, которая возвращает новый генератор со состоянием, как если быбыли сделаны вычисления.
- Philox — генератор на основе счётчика, способный к произвольному продвижению или генерации независимых потоков. Для получения дополнительной информации об этом классе генераторов бит см. страницу Random123.
- SFC64 — Быстрый генератор, основанный на случайных обратимых отображениях. Обычно самый быстрый из четырёх генераторов. Для получения (небольшого) дополнительного подробного описания см. страницу автора SFC .
| Базовый класс для универсальных генераторов бит, которые предоставляют поток случайных битов на основе различных алгоритмов. |
Инициализация и энтропия
Генератор бит обеспечивает поток случайных значений. Для генерации воспроизводимых потоков генераторы бит поддерживают установку начального состояния с помощью значения инициализации. Все предоставленные генераторы бит принимают целое число произвольного размера без знака или список таких целых чисел в качестве значения инициализации. Генераторам бит необходимо принять эти входные данные и обработать их в высококачественное внутреннее состояние для генератора бит. Все генераторы бит в 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 смешивает источники энтропии воспроизводимым образом, чтобы установить начальное состояние для независимых и, скорее всего, непересекающихся генераторов бит. |
© 2005–2020 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.19/reference/random/bit_generators/index.html