Spec-Zone.ru › NumPy 2.0

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

classnumpy.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) или массивом uint64 из 4 элементов. Если не указан, RNG инициализируется значением 0.

key{None, int, array_like}, optional

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

Примечания

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

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

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

Вектор состояния Philox состоит из 256-битового значения, закодированного как массив uint64 из 4 элементов, и 128-битового значения, закодированного как массив uint64 из 2 элементов. Первый — это счётчик, который увеличивается на 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]

Джон К. Сэлмон, Марк А. Мораес, Рон О. Дрор и Дэвид Э. Шоу, «Параллельные случайные числа: так же просто, как 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

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

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

advance(delta)

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

jumped([jumps])

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

Расширение

cffi

Интерфейс CFFI

ctypes

Интерфейс ctypes

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

Spec-Zone.ru

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