std::mersenne_twister_engine
Defined in header <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;
| (since C++11) |
mersenne_twister_engine is a random number engine based on Mersenne Twister algorithm. It produces high quality, but not cryptographically secure, unsigned integer random numbers of type UIntType on the interval \(\scriptsize {[0,2^w)}\)[0, 2w).
Template parameters
| UIntType | - | The result type generated by the generator. The effect is undefined if this is not one of unsignedshort, unsignedint, unsignedlong, or unsignedlonglong. |
| w | - | the power of two that determines the range of values generated by the engine |
| n | - | the degree of recurrence |
| m | - | the middle word, an offset used in the recurrence relation defining the state |
| r | - | the number of bits of the lower bit-mask, also known as the twist value |
| a | - | the conditional xor-mask, i.e. the coefficients of the rational normal form twist matrix |
| u, d, s, b, t, c, l | - | the 1st to 7th components of the bit-scrambling (tempering) matrix |
| f | - | the initialization multiplier |
If any of the following restrictions is violated, the program is ill-formed:
-
mis in[1,n]. - The following expressions are all
true: w >= 3w >= rw >= uw >= sw >= tw >= lw <= std::numeric_limits<UIntType>::digits- Given
(1u << w) - 1uasw1, the following expressions are alltrue: a <= w1b <= w1c <= w1d <= w1f <= w1
Generator properties
The size of the states of mersenne_twister_engine is n, each of them consists of a sequence X of n values of type result_type. \(\scriptsize X_j\)Xj stands for the \(\scriptsize j\mod n\)j mod nth value (starting from 0) of X.
Given the following bitwise operation notations:
- \(\scriptsize \mathsf{bitand}\)bitand, built-in bitwise AND.
- \(\scriptsize \mathsf{xor}\)xor, built-in bitwise XOR.
- \(\scriptsize \mathsf{lshift}\)lshift, built-in bitwise left-shift.
- \(\scriptsize \mathsf{rshift}\)rshift, built-in bitwise right-shift.
The transition algorithm of mersenne_twister_engine (\(\scriptsize TA(x_i)\)TA(xi)) is defined as follows:
- Concatenate the upper
w - rbits of \(\scriptsize X_{i-n}\)Xi-n with the lowerrbits of \(\scriptsize X_{i+1-n}\)Xi+1-n to obtain an unsigned integer valueY. - Let
ybe \(\scriptsize a \cdot (Y\ \mathsf{bitand}\ 1)\)a·(Y bitand 1), and set \(\scriptsize X_i\)Xi to \(\scriptsize X_{i+m−n}\ \mathsf{xor}\ (Y\ \mathsf{rshift}\ 1)\ \mathsf{xor}\ y\)Xi+m−n xor (Y rshift 1) xor y.
The generation algorithm of mersenne_twister_engine (\(\scriptsize GA(x_i)\)GA(xi)) is defined as follows:
- Let \(\scriptsize z_1\)z1 be \(\scriptsize X_i\ \mathsf{xor}\ ((X_i\ \mathsf{rshift}\ u)\ \mathsf{bitand}\ d)\)Xi xor ((Xi rshift u) bitand d).
- Let \(\scriptsize z_2\)z2 be \(\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).
- Let \(\scriptsize z_3\)z3 be \(\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).
- Let \(\scriptsize z_4\)z4 be \(\scriptsize z_3\ \mathsf{xor}\ (z_3\ \mathsf{rshift}\ l)\)z3 xor (z3 rshift l).
- Deliver \(\scriptsize z_4\)z4 as the result (i.e. \(\scriptsize GA(x_i)=z_4\)GA(xi)=z4).
Predefined specializations
The following specializations define the random number engine with two commonly used parameter sets:
Defined in header <random> |
|
|---|---|
| Type | Definition |
mt19937 (C++11) | std::mersenne_twister_engine<std::uint_fast32_t, |
mt19937_64 (C++11) | std::mersenne_twister_engine<std::uint_fast64_t, |
Nested types
| Type | Definition |
|---|---|
result_type |
UIntType |
Data members
|
constexpr size_t word_size
[static] |
w (public static member constant) |
|
constexpr size_t state_size
[static] |
n (public static member constant) |
|
constexpr size_t shift_size
[static] |
m (public static member constant) |
|
constexpr size_t mask_bits
[static] |
r (public static member constant) |
|
constexpr UIntType xor_mask
[static] |
a (public static member constant) |
|
constexpr size_t tempering_u
[static] |
u (public static member constant) |
|
constexpr UIntType tempering_d
[static] |
d (public static member constant) |
|
constexpr size_t tempering_s
[static] |
s (public static member constant) |
|
constexpr UIntType tempering_b
[static] |
b (public static member constant) |
|
constexpr size_t tempering_t
[static] |
t (public static member constant) |
|
constexpr UIntType tempering_c
[static] |
c (public static member constant) |
|
constexpr size_t tempering_l
[static] |
l (public static member constant) |
|
constexpr UIntType initialization_multiplier
[static] |
f (public static member constant) |
|
constexpr UIntType default_seed
[static] |
5489u (public static member constant) |
Member functions
Construction and Seeding |
|
| constructs the engine (public member function) |
|
| sets the current state of the engine (public member function) |
|
Generation |
|
| advances the engine's state and returns the generated value (public member function) |
|
| advances the engine's state by a specified amount (public member function) |
|
Characteristics |
|
|
[static] | gets the smallest possible value in the output range (public static member function) |
|
[static] | gets the largest possible value in the output range (public static member function) |
Non-member functions
|
(C++11)(C++11)(removed in C++20) | compares the internal states of two pseudo-random number engines (function) |
|
(C++11) | performs stream input and output on pseudo-random number engine (function template) |
Example
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/random/mersenne_twister_engine