std::philox_engine
Определён в заголовочном файле <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 | - | Тип результата, генерируемого генератором. Поведение не определено, если это не один из типов unsignedshort, unsignedint, unsignedlong или unsignedlonglong. |
| w | - | размер слова в битах |
| n | - | количество слов |
| r | - | количество раундов |
| consts | - | последовательность множителей и констант раундов, используемых для генерации случайных чисел |
Если любое из следующих значений не является true, программа некорректна:
sizeof...(consts) == nn == 2 || n == 40 < r0 < w && w <= std::numeric_limits<UIntType>::digits
Свойства генератора
В следующем описании \(\scriptsize Q_i \)Qi обозначает элемент последовательности Q с номером i, где нумерация начинается с нуля.
Размер состояний philox_engine равен \(\scriptsize O(n)\)O(n), каждое из них состоит из четырёх частей:
- Последовательность
Xизnцелочисленных значений, каждое из которых находится в диапазоне[0,2w). - Эта последовательность представляет собой значение большого беззнакового целого счётчика \(\scriptsize Z=\sum_{j=0}^{n-1} X \cdot 2^{wj} \)Z=∑n-1j=0X⋅2wj размером \(\scriptsize n \cdot w \)n⋅w бит.
- Последовательность
Kизn / 2ключей типаUIntType. - Буфер
Yизnсгенерированных значений типаUIntType. - Индекс
jв буфереY.
Алгоритм перехода philox_engine (\(\scriptsize TA(X_i) \)TA(Xi)) определяется следующим образом:
- Если
jне являетсяn - 1, увеличиваетjна1.[1] - Если
jявляетсяn - 1, выполняет следующие операции:[2]
- Генерирует новую последовательность из
nслучайных значений (см. ниже) и сохраняет их вY. - Увеличивает счётчик
Zна1. - Сбрасывает
jв0.
Алгоритм генерации philox_engine имеет вид \(\scriptsize GA(X_i)=Y_j \)GA(Xi)=Yj.
- В этом случае следующий вызов алгоритма генерации возвращает следующее сгенерированное значение из буфера.
- В этом случае буфер обновляется, а следующий вызов алгоритма генерации возвращает первое значение нового буфера.
Генерация случайных значений
Случайные значения генерируются на основе следующих параметров:
- количество раундов
r - текущая последовательность счётчика
X - последовательность ключей
K - последовательность множителей
M - последовательность констант раундов
C
Последовательности M и C формируются из значений пакета параметров шаблона consts, представляющего константы \(\scriptsize M_k \)Mk и \(\scriptsize C_k \)Ck в виде [\(\scriptsize M_0 \)M0,\(\scriptsize C_0 \)C0,\(\scriptsize M_1 \)M1,\(\scriptsize C_1 \)C1,... , ...,\(\scriptsize M_{n/2-1} \)Mn/2-1,\(\scriptsize C_{n/2-1} \)Cn/2-1].
Случайные числа генерируются следующим образом:
- Инициализирует выходную последовательность
SэлементамиX. - Обновляет элементы
Sв течениеrраундов. - Заменяет значения в буфере
Yзначениями изS.
Обновление выходной последовательности
На каждом раунде обновления промежуточная последовательность V инициализируется элементами S в заданном порядке:
n | \(\scriptsize V_{0} \)V0 | \(\scriptsize V_{1} \)V1 | \(\scriptsize V_{2} \)V2 | \(\scriptsize V_{3} \)V3 |
|---|---|---|---|---|
2 | \(\scriptsize S_0 \)S0 | \(\scriptsize S_1 \)S1 | Н/Д | |
4 | \(\scriptsize S_2 \)S2 | \(\scriptsize S_1 \)S1 | \(\scriptsize S_0 \)S0 | \(\scriptsize S_3 \)S3 |
Используются следующие обозначения операций:
- \(\scriptsize \mathsf{xor} \)xor — встроенная операция побитового исключающего ИЛИ.
- \(\scriptsize \mathsf{mullo} \)mullo вычисляет младшую половину модульного произведения и определяется как \(\scriptsize \mathsf{mullo}(a,b,w)=(a \cdot b) \mod 2^w \)mullo(a,b,w)=(a⋅b) mod 2w.
- \(\scriptsize \mathsf{mulhi} \)mulhi вычисляет старшую половину произведения и определяется как \(\scriptsize \mathsf{mulhi}(a,b,w)=\left\lfloor (a \cdot b)/2^w \right\rfloor \)mulhi(a,b,w)=⌊(a⋅b)/2w⌋.
Пусть q — текущий номер раунда (начиная с нуля). Для каждого целого числа k в [0, n / 2) элементы выходной последовательности S обновляются следующим образом:
- \(\scriptsize X_{2 \cdot k}=\mathsf{mulhi}(V_{2 \cdot k},M_k,w)\ \mathsf{xor}\ ((K_k+q \cdot C_k) \mod 2^w)\ \mathsf{xor}\ V_{2 \cdot k+1} \)X2⋅k=mulhi(V2⋅k,Mk,w) xor ((Kk+q⋅Ck) mod 2w) xor V2⋅k+1
- \(\scriptsize X_{2 \cdot k+1}=\mathsf{mullo}(V_{2 \cdot k},M_k,w) \)X2⋅k+1=mullo(V2⋅k,Mk,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 multipliers
[static] | Последовательность множителей M (открытая статическая константа-член) |
|
constexpr round_consts
[static] | Последовательность констант раундов C (открытая статическая константа-член) |
|
constexpr
std::uint_least32_t default_seed[static] |
20111115u (открытая статическая константа-член) |
Функции-члены
Создание и инициализация начальным значением |
|
| создаёт движок (открытая функция-член) |
|
| задаёт текущее состояние движка (открытая функция-член) |
|
| задаёт текущее значение счётчика движка (открытая функция-член) |
|
Генерация |
|
| изменяет состояние движка и возвращает сгенерированное значение (открытая функция-член) |
|
| изменяет состояние движка на заданное количество шагов (открытая функция-член) |
|
Характеристики |
|
|
[static] | возвращает наименьшее возможное значение в диапазоне выходных значений (открытая статическая функция-член) |
|
[static] | возвращает наибольшее возможное значение в диапазоне выходных значений (открытая статическая функция-член) |
Функции, не являющиеся членами
|
(C++26) | сравнивает внутренние состояния двух движков генерации псевдослучайных чисел (функция) |
|
(C++26) | выполняет ввод и вывод в поток для движка генерации псевдослучайных чисел (шаблон функции) |
Примечания
| Макрос проверки поддержки | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_philox_engine | 202406L | (C++26) |
std::philox_engine |
Пример
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/random/philox_engine