Генератор псевдослучайных чисел Philox
- classnumpy.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) или массивом uint64 из 4 элементов. Если не указан, RNG инициализируется значением 0.
- key{None, int, array_like}, optional
-
Ключ для использования в состоянии Philox. В отличие от
seed, значение в ключе устанавливается напрямую. Может быть целым числом 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-битных псевдослучайных чисел. Второй — ключ, который определяет генерируемую последовательность. Использование разных ключей приводит к независимым последовательностям.Ввод
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
-
Экземпляр блокировки, используемый совместно, чтобы один и тот же генератор битов мог использоваться в нескольких генераторах без нарушения состояния. Код, генерирующий значения из генератора битов, должен удерживать блокировку генератора битов.
Состояние
Получение или установка состояния PRNG |
Параллельная генерация
Расширение
© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/random/bit_generators/philox.html