Spec-Zone.ru › C++

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) == n
  • n == 2 || n == 4
  • 0 < r
  • 0 < 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]
  1. Генерирует новую последовательность из n случайных значений (см. ниже) и сохраняет их в Y.
  2. Увеличивает счётчик Z на 1.
  3. Сбрасывает j в 0.

Алгоритм генерации philox_engine имеет вид \(\scriptsize GA(X_i)=Y_j \)GA(Xi)=Yj.

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

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

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

  • количество раундов 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].

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

  1. Инициализирует выходную последовательность S элементами X.
  2. Обновляет элементы S в течение r раундов.
  3. Заменяет значения в буфере 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
(открытая статическая константа-член)

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

Создание и инициализация начальным значением
(constructor)
создаёт движок
(открытая функция-член)
seed
задаёт текущее состояние движка
(открытая функция-член)
set_counter
задаёт текущее значение счётчика движка
(открытая функция-член)
Генерация
operator()
изменяет состояние движка и возвращает сгенерированное значение
(открытая функция-член)
discard
изменяет состояние движка на заданное количество шагов
(открытая функция-член)
Характеристики
min
[static]
возвращает наименьшее возможное значение в диапазоне выходных значений
(открытая статическая функция-член)
max
[static]
возвращает наибольшее возможное значение в диапазоне выходных значений
(открытая статическая функция-член)

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

operator==
(C++26)
сравнивает внутренние состояния двух движков генерации псевдослучайных чисел
(функция)
operator<<operator>>
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API