Spec-Zone.ru › NumPy 1.18

Генератор псевдослучайных чисел 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 для получения значений энтропии и использования их для генерации новых 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

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

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

advance(delta)

Продвижение основного генератора случайных чисел как будто произошло delta выборок.

jumped([jumps])

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

Расширение

cffi

Интерфейс CFFI

ctypes

Интерфейс ctypes

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

Spec-Zone.ru

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