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