Spec-Zone.ru › NumPy 1.19

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

key{None, int, array_like}, optional

Ключ для использования в состоянии Philox. В отличие от seed, значение ключа задаётся напрямую. Может быть целым числом Python в диапазоне [0, 2128) или массивом из 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, 2256). При использовании 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

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

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

advance(delta)

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

jumped([jumps])

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

Расширение

cffi

CFFI интерфейс

ctypes

ctypes интерфейс

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

Spec-Zone.ru

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