Счетчиковый ГСЧ Philox#
- класс numpy.random.Philox(seed=None, счетчик=None, ключ=None)#
Контейнер для генератора псевдослучайных чисел Philox (4x64).
- Параметры:
- seed{None, int, array_like[ints], SeedSequence}, необязательный
Семя для инициализации
BitGenerator. Если None, то свежая, непредсказуемая энтропия будет взята из ОС. Еслиintилиarray_like[ints]передается, то он будет передан вSeedSequenceдля получения начальногоBitGeneratorсостояние. Также можно передатьSeedSequenceэкземпляр.- счетчик{None, int, array_like}, optional
Счетчик для использования в состоянии Philox. Может быть либо целым числом Python (long в 2.x) в [0, 2**256), либо 4-элементным массивом uint64. Если не указано, RNG инициализируется на 0.
- ключ{None, int, array_like}, optional
Ключ для использования в состоянии Philox. В отличие от
seed, значение в ключе устанавливается напрямую. Может быть либо целым числом Python в [0, 2**128), либо 2-элементным массивом uint64. ключ иseedне могут использоваться одновременно.
Примечания
Philox — это 64-битный генератор псевдослучайных чисел, использующий счетчиковую архитектуру на основе более слабых (и быстрых) версий криптографических функций [1]. Экземпляры, использующие разные значения ключа, создают независимые последовательности. Philox имеет период \(2^{256} - 1\) и поддерживает произвольное продвижение и перескакивание последовательности с шагом \(2^{128}\). Эти функции позволяют генерировать несколько непересекающихся последовательностей.
Philoxпредоставляет капсулу, содержащую указатели на функции, которые производят числа с плавающей запятой двойной точности, а также беззнаковые 32- и 64-битные целые числа. Они не могут быть использованы напрямую в Python и должны быть обработаныGeneratorили аналогичный объект, поддерживающий низкоуровневый доступ.Состояние и инициализация
The
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]John K. Salmon, Mark A. Moraes, Ron O. Dror и 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
Экземпляр Lock, который является общим, чтобы один и тот же генератор битов мог использоваться в нескольких Generators без повреждения состояния. Код, который генерирует значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние#
Получить или установить состояние ГПСЧ |