Namespaces
Variants

std:: philox_engine

From cppreference.net
Определено в заголовочном файле <random>
template <

class UIntType, std:: size_t w, std:: size_t n, std:: size_t r,
UIntType... consts
>

class philox_engine ;
(начиная с C++26)

std::philox_engine — это счетчиковый генератор случайных чисел.

Содержание

Параметры шаблона

UIntType - Тип результата, генерируемый генератором. Поведение не определено, если это не один из unsigned short , unsigned int , unsigned long , или unsigned long long .
w - размер слова в битах
n - количество слов
r - количество раундов
consts - последовательность множителей и констант раундов, используемых для генерации случайных чисел

Если любое из следующих значений не равно true , программа является некорректной:

Свойства генератора

В следующем описании пусть Q i обозначает i -й элемент последовательности Q , где индекс начинается с нуля.

Размер состояний philox_engine составляет O(n) , каждое из них состоит из четырёх частей:

  • Последовательность X из n целочисленных значений, где каждое значение находится в диапазоне [ 0 , 2 w
    )
    .
  • Эта последовательность представляет большое целое беззнаковое значение счетчика Z=∑ n-1
    j=0
    X⋅2 wj
    размером n⋅w бит.
  • Последовательность K из n / 2 ключей типа UIntType .
  • Буфер Y из n сгенерированных значений типа UIntType .
  • Индекс j в буфере Y .

Алгоритм перехода для philox_engine ( TA(X i ) ) определяется следующим образом:

  • Если j не равно n - 1 , увеличивает j на 1 . [1]
  • Если j равно n - 1 , выполняет следующие операции: [2]
  1. Генерирует новую последовательность из n случайных значений (см. ниже) и сохраняет их в Y .
  2. Увеличивает счётчик Z на 1 .
  3. Сбрасывает j в 0 .

Алгоритм генерации для philox_engine имеет вид GA(X i )=Y j .

  1. В этом случае вызов алгоритма следующего поколения возвращает следующее сгенерированное значение в буфере.
  2. В этом случае буфер обновляется, и вызов алгоритма следующего поколения возвращает первое значение в новом буфере.

Генерация случайных значений

Случайные значения генерируются из следующих параметров:

  • количество раундов r
  • текущая счетная последовательность X
  • ключевая последовательность K
  • последовательность множителей M
  • последовательность констант раунда C

Последовательности M и C формируются из значений параметра шаблона consts , который представляет константы M k и C k в виде [ M 0 , C 0 , M 1 , C 1 ,... , ..., M n/2-1 , C n/2-1 ] .

Случайные числа генерируются следующим процессом:

  1. Инициализирует выходную последовательность S элементами из X .
  2. Обновляет элементы S в течение r раундов.
  3. Заменяет значения в буфере Y значениями из S .

Обновление выходной последовательности

На каждом раунде обновления промежуточная последовательность V инициализируется элементами S в указанном порядке:

n V 0 V 1 V 2 V 3
2 S 0 S 1 Н/Д
4 S 2 S 1 S 0 S 3

Даны следующие обозначения операций:

  • xor , встроенная побитовая операция XOR .
  • mullo , вычисляет младшую половину модульного умножения и определяется как mullo(a,b,w)=(a⋅b) mod 2 w
    .
  • mulhi , вычисляет старшую половину умножения и определяется как mulhi(a,b,w)=⌊(a⋅b)/2 w
    .

Пусть q будет текущим номером раунда (начиная с нуля), для каждого целого числа k в [ 0 , n / 2 ) , элементы выходной последовательности S обновляются следующим образом:

  • X 2⋅k =mulhi(V 2⋅k ,M k ,w) xor ((K k +q⋅C k ) mod 2 w
    ) xor V 2⋅k+1
  • X 2⋅k+1 =mullo(V 2⋅k ,M k ,w)

Предопределенные специализации

Следующие специализации определяют генератор случайных чисел с двумя часто используемыми наборами параметров:

Определено в заголовке <random>
Тип Определение
philox4x32 (C++26) std :: philox_engine < std:: uint_fast32_t , 32 , 4 , 10 ,
0xCD9E8D57 , 0x9E3779B9 ,
0xD2511F53 , 0xBB67AE85 >
philox4x64 (C++26) std :: philox_engine < std:: uint_fast64_t , 64 , 4 , 10 ,
0xCA5A826395121157 , 0x9E3779B97F4A7C15 ,
0xD2E7470EE14C6C93 , 0xBB67AE8584CAA73B >

Вложенные типы

Тип Определение
result_type UIntType

Члены данных

constexpr std::size_t word_size
[static]
w
(публичная статическая константа-член)
constexpr std::size_t word_count
[static]
n
(публичная статическая константа-член)
constexpr std::size_t round_count
[static]
r
(публичная статическая константа-член)
constexpr std:: array < result_type, word_count / 2 > multipliers
[static]
последовательность множителей M
(публичная статическая константа-член)
constexpr std:: array < result_type, word_count / 2 > round_consts
[static]
последовательность констант раунда C
(публичная статическая константа-член)
constexpr std::uint_least32_t default_seed
[static]
20111115u
(публичная статическая константа-член)

Функции-члены

Конструкция и инициализация
конструирует движок
(public member function)
устанавливает текущее состояние движка
(public member function)
устанавливает текущий счетчик движка
(public member function)
Генерация
продвигает состояние движка и возвращает сгенерированное значение
(public member function)
продвигает состояние движка на указанное количество
(public member function)
Характеристики
[static]
получает наименьшее возможное значение в выходном диапазоне
(public static member function)
[static]
получает наибольшее возможное значение в выходном диапазоне
(public static member function)

Функции, не являющиеся членами класса

(C++26)
сравнивает внутренние состояния двух генераторов псевдослучайных чисел
(функция)
выполняет потоковый ввод и вывод для генератора псевдослучайных чисел
(шаблон функции)

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_philox_engine 202406L (C++26) std::philox_engine

Пример