Генератор псевдослучайных чисел 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. Если не указан, генератор инициализируется значением 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для получения значений энтропии и использование этих значений для генерации новых 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, 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, «Parallel Random Numbers: As Easy as 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
-
Экземпляр блокировки, используемый совместно, чтобы один и тот же генератор битов можно было использовать в нескольких генераторах без повреждения состояния. Код, генерирующий значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние
Получить или установить состояние генератора псевдослучайных чисел |
Параллельная генерация
| Продвинуть основной генератор RNG, как будто произошло delta вызовов. |
| Возвращает новый генератор битов с перескоком состояния |
Расширение
Интерфейс CFFI | |
Интерфейс ctypes |
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/random/bit_generators/philox.html