Spec-Zone.ru › NumPy 1.17

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

class numpy.random.philox.Philox(seed=None, counter=None, key=None)

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

Параметры:
seed : {None, int, array_like[ints], ISeedSequence}, optional

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

counter : {None, int, array_like}, optional

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

key : {None, int, array_like}, optional

Ключ для использования в состоянии Philox. В отличие от зерна, значение в ключе устанавливается напрямую. Может быть целым числом 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-битных случайных числа. Второй — ключ, определяющий сгенерированную последовательность. Использование разных ключей создаёт независимые последовательности.

Входное зерно обрабатывается функцией 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 гарантирует, что фиксированное зерно всегда будет генерировать одну и ту же последовательность случайных целых чисел.

Ссылки

[1] John K. Salmon, Mark A. Moraes, Ron O. Dror, and 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

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

Состояние

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

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

advance(delta) Передвинуть базовый генератор, как если бы произошло delta обращений.
jumped([jumps]) Возвращает новый генератор битов со смещённым состоянием

Расширение

cffi Интерфейс CFFI
ctypes Интерфейс ctypes

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

Spec-Zone.ru

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