Генератор псевдослучайных чисел Philox на основе счётчика
-
class numpy.random.philox.Philox(seed=None, counter=None, key=None) -
Контейнер для генератора псевдослучайных чисел Philox (4x64).
Параметры: -
seed : {None, int, array_like[ints], ISeedSequence}, optional -
Зерно для инициализации
BitGenerator. Если None, то будет использована свежая, непредсказуемая энтропия из ОС. Если передаётсяintилиarray_like[ints], то он будет передан вSeedSequence, чтобы вывести начальное состояниеBitGenerator. Также можно передать реализацию интерфейсаISeedSequence, например,SeedSequence. -
counter : {None, int, array_like}, optional -
Счётчик для использования в состоянии Philox. Может быть целым числом Python (long в 2.x) в [0, 2**256) или массивом uint64 из 4 элементов. Если не указано, генератор инициализируется значением 0.
-
key : {None, int, array_like}, optional -
Ключ для использования в состоянии Philox. В отличие от зерна, значение в ключе устанавливается напрямую. Может быть целым числом Python в [0, 2**128) или массивом uint64 из 2 элементов.
keyиseedне могут быть использованы одновременно.
Примечания
Philox — генератор псевдослучайных чисел 64-битный, использующий счётчик на основе более слабых (но более быстрых) версий криптографических функций [1]. Экземпляры, использующие разные значения ключа, производят независимые последовательности. Philox имеет период
и поддерживает произвольное продвижение и скачок последовательности с шагом
. Эти функции позволяют генерировать несколько неперекрывающихся последовательностей.
Philoxпредоставляет капсулу, содержащую указатели функций, которые производят числа с плавающей точкой и целые числа с беззнаковым 32 и 64 разрядами. Они не могут быть непосредственно использованы в Python и должны быть использованы объектомGeneratorили аналогичным объектом, поддерживающим низкоуровневый доступ.Состояние и инициализация
Вектор состояния
Philoxсостоит из 256-битного значения, закодированного как массив uint64 из 4 элементов, и 128-битного значения, закодированного как массив uint64 из 2 элементов. Первый — счётчик, который увеличивается на 1 за каждые 4 сгенерированных 64-битных случайных числа. Второй — ключ, определяющий сгенерированную последовательность. Использование разных ключей создаёт независимые последовательности.Входное зерно обрабатывается функцией
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гарантирует, что фиксированное зерно всегда будет генерировать одну и ту же последовательность случайных целых чисел.Ссылки
[1] John K. Salmon, Mark A. Moraes, Ron O. Dror, and 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
-
Экземпляр блокировки, который используется совместно, так что один и тот же генератор битов может использоваться в нескольких генераторах без нарушения состояния. Код, генерирующий значения из генератора битов, должен удерживать блокировку генератора битов.
-
Состояние
state | Получить или установить состояние PRNG |
Параллельная генерация
advance(delta) | Передвинуть базовый генератор, как если бы произошло delta обращений. |
jumped([jumps]) | Возвращает новый генератор битов со смещённым состоянием |
Расширение
cffi | Интерфейс CFFI |
ctypes | Интерфейс ctypes |
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/random/bit_generators/philox.html