Spec-Zone.ru › NumPy 1.21

Генератор псевдослучайных чисел 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. Если не указан, генератор инициализируется значением 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, «Parallel Random Numbers: As Easy as 1, 2, 3», Труды Международной конференции по высокопроизводительным вычислениям, сетям, хранению и анализу (SC11), Нью-Йорк, США: ACM, 2011.

Примеры

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

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

Состояние

state

Получить или установить состояние генератора псевдослучайных чисел

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

advance(delta)

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

jumped([jumps])

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

Расширение

cffi

Интерфейс CFFI

ctypes

Интерфейс ctypes

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

Spec-Zone.ru

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