Spec-Zone.ru › NumPy 1.20

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

class numpy.random.Philox(seed=None, counter=None, key=None)

Контейнер для генератора псевдослучайных чисел Philox (4x64).

Параметры
seed{None, int, array_like[ints], SeedSequence}, optional

Зерно для инициализации BitGenerator. Если None, то свежая, непредсказуемая энтропия будет взята из ОС. Если передаётся int или array_like[ints], то оно будет передано в SeedSequence для получения начального состояния BitGenerator. Также можно передать экземпляр SeedSequence.

counter{None, int, array_like}, optional

Счётчик для использования в состоянии Philox. Может быть целым числом Python (long в 2.x) в диапазоне [0, 2**256) или массивом из 4 элементов типа uint64. Если не указано, RNG инициализируется значением 0.

key{None, int, array_like}, optional

Ключ для использования в состоянии Philox. В отличие от seed, значение в ключе устанавливается напрямую. Может быть целым числом Python в диапазоне [0, 2**128) или массивом из 2 элементов типа uint64. key и seed не могут быть использованы одновременно.

Примечания

Philox — 64-битный генератор псевдослучайных чисел, использующий счётчик на основе более слабых (и более быстрых) версий криптографических функций [1]. Экземпляры с различными значениями ключа производят независимые последовательности. Philox имеет период 2^{256} - 1 и поддерживает произвольное продвижение и перепрыгивание последовательности с шагом 2^{128}. Эти функции позволяют генерировать несколько неперекрывающихся последовательностей.

Philox предоставляет капсулу, содержащую указатели на функции, которые производят числа с плавающей точкой и целые числа без знака 32 и 64 бит. Они не подлежат непосредственному использованию в Python и должны быть использованы объектом Generator или аналогичным объектом, поддерживающим доступ к низкоуровневым функциям.

Состояние и Инициализация

Вектор состояния Philox состоит из 256-битного значения, закодированного в виде массива из 4 элементов типа uint64, и 128-битного значения, закодированного в виде массива из 2 элементов типа uint64. Первый — счётчик, который увеличивается на 1 для каждого 4-х 64-битных случайных чисел, произведённых. Второй — ключ, определяющий генерируемую последовательность. Использование различных ключей приводит к независимым последовательностям.

Входной параметр seed обрабатывается SeedSequence для генерации ключа. Счётчик устанавливается в 0.

В качестве альтернативы, можно опустить параметр seed и установить key и counter напрямую.

Параллельные Функции

Предпочтительный способ использования BitGenerator в параллельных приложениях — использование метода SeedSequence.spawn для получения значений энтропии и использование этих значений для генерации новых BitGenerator:

>>> from numpy.random import Generator, Philox, SeedSequence
>>> sg = SeedSequence(1234)
>>> rg = [Generator(Philox(s)) for s in sg.spawn(10)]

Philox может быть использовано в параллельных приложениях путём вызова метода jumped для продвижения состояния так, как будто 2^{128} случайных чисел были сгенерированы. В качестве альтернативы, advance может быть использовано для продвижения счётчика на любой положительный шаг в диапазоне [0, 2**256). При использовании jumped, все генераторы должны быть объединены, чтобы убедиться, что сегменты поступают из одной последовательности.

>>> from numpy.random import Generator, Philox
>>> bit_generator = Philox(1234)
>>> rg = []
>>> for _ in range(10):
...    rg.append(Generator(bit_generator))
...    bit_generator = bit_generator.jumped()

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

>>> key = 2**96 + 2**33 + 2**17 + 2**9
>>> rg = [Generator(Philox(key=key+i)) for i in range(10)]

Гарантия Совместимости

Philox гарантирует, что фиксированный seed всегда будет производить один и тот же поток случайных целых чисел.

Ссылки

1

John K. Salmon, Mark A. Moraes, Ron O. Dror и David E. Shaw, «Параллельные случайные числа: так просто, как 1, 2, 3», Труды Международной конференции по высокопроизводительным вычислениям, сетям, хранилищам и анализу (SC11), Нью-Йорк, NY: ACM, 2011.

Примеры

>>> from numpy.random import Generator, Philox
>>> rg = Generator(Philox(1234))
>>> rg.standard_normal()
0.123  # random
Атрибуты
lock: threading.Lock

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

Состояние

state

Получение или установка состояния PRNG

Параллельная генерация

advance(delta)

Продвижение базового RNG так, как будто произошло delta операций.

jumped([jumps])

Возвращает новый генератор бит со скорректированным состоянием

Расширение

cffi

Интерфейс CFFI

ctypes

Интерфейс ctypes

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

Spec-Zone.ru

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