Генератор псевдослучайных чисел 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 имеет период
и поддерживает произвольное продвижение и перепрыгивание последовательности с шагом
. Эти функции позволяют генерировать несколько неперекрывающихся последовательностей.
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для продвижения состояния так, как будтослучайных чисел были сгенерированы. В качестве альтернативы,
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, «Параллельные случайные числа: так просто, как 1, 2, 3», Труды Международной конференции по высокопроизводительным вычислениям, сетям, хранилищам и анализу (SC11), Нью-Йорк, NY: ACM, 2011.
Примеры
>>> from numpy.random import Generator, Philox >>> rg = Generator(Philox(1234)) >>> rg.standard_normal() 0.123 # random
- Атрибуты
-
- lock: threading.Lock
-
Экземпляр блокировки, который используется совместно, чтобы один и тот же генератор бит мог использоваться в нескольких генераторах без повреждения состояния. Код, который генерирует значения из генератора бит, должен удерживать блокировку генератора бит.
Состояние
Получение или установка состояния PRNG |
Параллельная генерация
| Продвижение базового RNG так, как будто произошло delta операций. |
| Возвращает новый генератор бит со скорректированным состоянием |
Расширение
Интерфейс CFFI | |
Интерфейс ctypes |
© 2005–2021 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.20/reference/random/bit_generators/philox.html