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