Счетчиковый ГСЧ Philox#

класс numpy.random.Philox(seed=None, счетчик=None, ключ=None)#

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

Параметры:
seed{None, int, array_like[ints], SeedSequence}, необязательный

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

счетчик{None, int, array_like}, optional

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

ключ{None, int, array_like}, optional

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

Примечания

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

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

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

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

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

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

Параллельные возможности

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

>>> 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, "Parallel Random Numbers: As Easy as 1, 2, 3," Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC11), New York, NY: ACM, 2011.

Примеры

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

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

Состояние#

state

Получить или установить состояние ГПСЧ

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

advance(дельта)

Продвиньте базовый ГСЧ, как если бы произошло delta выборок.

jumped([jumps])

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

Расширение#

cffi

CFFI интерфейс

ctypes

интерфейс ctypes