std::mersenne_twister_engine
Определён в заголовочном файле <random> | ||
|---|---|---|
template<
class UIntType, std::size_t w, std::size_t n, std::size_t m, std::size_t r,
UIntType a, std::size_t u, UIntType d, std::size_t s,
UIntType b, std::size_t t, UIntType c, std::size_t l, UIntType f
> class mersenne_twister_engine;
| (начиная с C++11) |
mersenne_twister_engine — это генератор случайных чисел, основанный на алгоритме вихря Мерсенна. Он генерирует высококачественные, но не криптографически стойкие случайные беззнаковые целые числа типа UIntType в диапазоне \(\scriptsize {[0,2^w)}\)[0, 2w).
Параметры шаблона
| UIntType | - | Тип результата, генерируемого генератором. Поведение не определено, если это не один из типов unsignedshort, unsignedint, unsignedlong или unsignedlonglong. |
| w | - | степень двойки, определяющая диапазон значений, генерируемых генератором |
| n | - | порядок рекуррентного соотношения |
| m | - | среднее слово — смещение, используемое в рекуррентном соотношении, определяющем состояние |
| r | - | число битов младшей битовой маски, также называемое значением скручивания |
| a | - | условная маска XOR, то есть коэффициенты матрицы скручивания в рациональной нормальной форме |
| u, d, s, b, t, c, l | - | компоненты с 1-й по 7-ю матрицы перемешивания битов (темперирования) |
| f | - | множитель инициализации |
Если нарушено любое из следующих ограничений, программа некорректна:
-
mвходит в[1,n]. - Все следующие выражения являются
true: w >= 3w >= rw >= uw >= sw >= tw >= lw <= std::numeric_limits<UIntType>::digits- Если
(1u << w) - 1uзадано какw1, все следующие выражения являютсяtrue: a <= w1b <= w1c <= w1d <= w1f <= w1
Свойства генератора
Размер состояний mersenne_twister_engine равен n; каждое из них состоит из последовательности X из n значений типа result_type. \(\scriptsize X_j\)Xj обозначает значение X с индексом \(\scriptsize j\mod n\)j mod nth (начиная с 0).
Используются следующие обозначения побитовых операций:
- \(\scriptsize \mathsf{bitand}\)bitand — встроенная операция побитового И.
- \(\scriptsize \mathsf{xor}\)xor — встроенная операция побитового исключающего ИЛИ.
- \(\scriptsize \mathsf{lshift}\)lshift — встроенная операция побитового сдвига влево.
- \(\scriptsize \mathsf{rshift}\)rshift — встроенная операция побитового сдвига вправо.
Алгоритм перехода mersenne_twister_engine (\(\scriptsize TA(x_i)\)TA(xi)) определяется следующим образом:
- Объединить старшие
w - rбитов \(\scriptsize X_{i-n}\)Xi-n с младшимиrбитами \(\scriptsize X_{i+1-n}\)Xi+1-n, чтобы получить беззнаковое целое значениеY. - Пусть
yравно \(\scriptsize a \cdot (Y\ \mathsf{bitand}\ 1)\)a·(Y bitand 1), а \(\scriptsize X_i\)Xi присвоить значение \(\scriptsize X_{i+m−n}\ \mathsf{xor}\ (Y\ \mathsf{rshift}\ 1)\ \mathsf{xor}\ y\)Xi+m−n xor (Y rshift 1) xor y.
Алгоритм генерации mersenne_twister_engine (\(\scriptsize GA(x_i)\)GA(xi)) определяется следующим образом:
- Пусть \(\scriptsize z_1\)z1 равно \(\scriptsize X_i\ \mathsf{xor}\ ((X_i\ \mathsf{rshift}\ u)\ \mathsf{bitand}\ d)\)Xi xor ((Xi rshift u) bitand d).
- Пусть \(\scriptsize z_2\)z2 равно \(\scriptsize z_1\ \mathsf{xor}\ (((z_1\ \mathsf{lshift}\ s)\mod 2^w)\ \mathsf{bitand}\ b)\)Xi xor (((Xi lshift s) mod 2w) bitand b).
- Пусть \(\scriptsize z_3\)z3 равно \(\scriptsize z_2\ \mathsf{xor}\ (((z_2\ \mathsf{lshift}\ t)\mod 2^w)\ \mathsf{bitand}\ c)\)Xi xor (((Xi lshift t) mod 2w) bitand c).
- Пусть \(\scriptsize z_4\)z4 равно \(\scriptsize z_3\ \mathsf{xor}\ (z_3\ \mathsf{rshift}\ l)\)z3 xor (z3 rshift l).
- Вернуть \(\scriptsize z_4\)z4 в качестве результата (то есть \(\scriptsize GA(x_i)=z_4\)GA(xi)=z4).
Предопределённые специализации
Следующие специализации задают генератор случайных чисел с двумя часто используемыми наборами параметров:
Определено в заголовочном файле <random> |
|
|---|---|
| Тип | Определение |
mt19937 (C++11) | std::mersenne_twister_engine<std::uint_fast32_t, |
mt19937_64 (C++11) | std::mersenne_twister_engine<std::uint_fast64_t, |
Вложенные типы
| Тип | Определение |
|---|---|
result_type |
UIntType |
Члены-данные
|
constexpr size_t word_size
[static] |
w (общедоступная статическая константа-член) |
|
constexpr size_t state_size
[static] |
n (общедоступная статическая константа-член) |
|
constexpr size_t shift_size
[static] |
m (общедоступная статическая константа-член) |
|
constexpr size_t mask_bits
[static] |
r (общедоступная статическая константа-член) |
|
constexpr UIntType xor_mask
[static] |
a (общедоступная статическая константа-член) |
|
constexpr size_t tempering_u
[static] |
u (общедоступная статическая константа-член) |
|
constexpr UIntType tempering_d
[static] |
d (общедоступная статическая константа-член) |
|
constexpr size_t tempering_s
[static] |
s (общедоступная статическая константа-член) |
|
constexpr UIntType tempering_b
[static] |
b (общедоступная статическая константа-член) |
|
constexpr size_t tempering_t
[static] |
t (общедоступная статическая константа-член) |
|
constexpr UIntType tempering_c
[static] |
c (общедоступная статическая константа-член) |
|
constexpr size_t tempering_l
[static] |
l (общедоступная статическая константа-член) |
|
constexpr UIntType initialization_multiplier
[static] |
f (общедоступная статическая константа-член) |
|
constexpr UIntType default_seed
[static] |
5489u (общедоступная статическая константа-член) |
Функции-члены
Создание и инициализация |
|
| создаёт генератор (функция-член с открытым доступом) |
|
| устанавливает текущее состояние генератора (функция-член с открытым доступом) |
|
Генерация |
|
| продвигает состояние генератора и возвращает сгенерированное значение (функция-член с открытым доступом) |
|
| продвигает состояние генератора на заданное число шагов (функция-член с открытым доступом) |
|
Характеристики |
|
|
[static] | возвращает наименьшее возможное значение в выходном диапазоне (общедоступная статическая функция-член) |
|
[static] | возвращает наибольшее возможное значение в выходном диапазоне (общедоступная статическая функция-член) |
Функции, не являющиеся членами
|
(C++11)(C++11)(удалён в C++20) | сравнивает внутренние состояния двух генераторов псевдослучайных чисел (функция) |
|
(C++11) | выполняет ввод и вывод генератора псевдослучайных чисел через поток (шаблон функции) |
Пример
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/random/mersenne_twister_engine