std:: philox_engine
|
Определено в заголовочном файле
<random>
|
||
|
template
<
class
UIntType,
std::
size_t
w,
std::
size_t
n,
std::
size_t
r,
|
(начиная с C++26) | |
std::philox_engine
— это счетчиковый генератор случайных чисел.
Содержание |
Параметры шаблона
| UIntType | - | Тип результата, генерируемый генератором. Поведение не определено, если это не один из unsigned short , unsigned int , unsigned long , или unsigned long long . |
| w | - | размер слова в битах |
| n | - | количество слов |
| r | - | количество раундов |
| consts | - | последовательность множителей и констант раундов, используемых для генерации случайных чисел |
Если любое из следующих значений не равно true , программа является некорректной:
- sizeof... ( consts ) == n
- n == 2 || n == 4
- 0 < r
- 0 < w && w <= std:: numeric_limits < UIntType > :: digits
Свойства генератора
В следующем описании пусть Q i обозначает i -й элемент последовательности Q , где индекс начинается с нуля.
Размер
состояний
philox_engine
составляет
O(n)
, каждое из них состоит из четырёх частей:
-
Последовательность
X
из
n
целочисленных значений, где каждое значение находится в диапазоне
[ 0 ,2w
).
-
-
Эта последовательность представляет большое целое беззнаковое значение счетчика
Z=∑
n-1
j=0 X⋅2 wj
размером n⋅w бит.
-
Эта последовательность представляет большое целое беззнаковое значение счетчика
Z=∑
n-1
-
Последовательность
K
из
n
/
2
ключей типа
UIntType. -
Буфер
Y
из
n
сгенерированных значений типа
UIntType. - Индекс j в буфере Y .
Алгоритм перехода
для
philox_engine
(
TA(X
i
)
) определяется следующим образом:
- Если j не равно n - 1 , увеличивает j на 1 . [1]
- Если j равно n - 1 , выполняет следующие операции: [2]
- Генерирует новую последовательность из n случайных значений (см. ниже) и сохраняет их в Y .
- Увеличивает счётчик Z на 1 .
- Сбрасывает j в 0 .
Алгоритм
генерации
для
philox_engine
имеет вид
GA(X
i
)=Y
j
.
- ↑ В этом случае вызов алгоритма следующего поколения возвращает следующее сгенерированное значение в буфере.
- ↑ В этом случае буфер обновляется, и вызов алгоритма следующего поколения возвращает первое значение в новом буфере.
Генерация случайных значений
Случайные значения генерируются из следующих параметров:
- количество раундов 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
]
.
Случайные числа генерируются следующим процессом:
- Инициализирует выходную последовательность S элементами из X .
- Обновляет элементы S в течение r раундов.
- Заменяет значения в буфере 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)
|
сравнивает внутренние состояния двух генераторов псевдослучайных чисел
(функция) |
|
(C++26)
|
выполняет потоковый ввод и вывод для генератора псевдослучайных чисел
(шаблон функции) |
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_philox_engine
|
202406L
|
(C++26) |
std::philox_engine
|
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |