- random[meta header]
- std[meta namespace]
- type-alias[meta id-type]
- cpp11[meta cpp]
namespace std {
using mt19937 = mersenne_twister_engine<
uint_fast32_t,
32, 624, 397, 31,
0x9908b0df, 11, 0xffffffff, 7,
0x9d2c5680, 15, 0xefc60000, 18, 1812433253
>;
}
- mersenne_twister_engine[link mersenne_twister_engine.md]
- uint_fast32_t[link /reference/cstdint/uint_fast32_t.md]
パラメータ設定済みのmersenne_twister_engine
。
32ビット版のメルセンヌ・ツイスター。64ビット版はmt19937_64
。
19937という名称は、メルセンヌ・ツイスター法によって生成される乱数列の周期から来ている(219937 - 1)。
mt19937
型オブジェクトをデフォルト構築した場合、10000番目に生成される擬似乱数の値は4123659995
であること。
219937 - 1
(624 + 1) * sizeof(uint_fast32_t)
- uint_fast32_t[link /reference/cstdint/uint_fast32_t.md]
メルセンヌ・ツイスターのシフトサイズ(624) + 現在の状態(1)。
環境によって変動する可能性はあるが、minstd_rand
やminstd_rand0
より4倍ほど速い。
623次元で一様分布する。
このトレードオフは、各出力の間(現在の状態と次の状態)の相関関係が、無視できるほどしかないということを意味する。たとえばN次元のランダムなベクトルを生成する場合、各次元の値に相関関係がほぼない状態にできる。
mt19937
は、624個の連続した過去の出力履歴があれば、次に出現する値を予測できる。
参照 : Mersenne Twisterの次に出す値を推測する - 憂鬱な午後のひととき
#include <iostream>
#include <random>
int main()
{
std::random_device seed_gen;
std::mt19937 engine(seed_gen());
for (int i = 0; i < 10; ++i) {
std::uint32_t result = engine();
std::cout << result << std::endl;
}
}
- std::mt19937[color ff0000]
- std::random_device[link random_device.md]
- seed_gen()[link random_device/op_call.md]
- engine()[link mersenne_twister_engine/op_call.md]
187052875
1658563244
2429782613
1877839754
2940926841
869137381
1607700369
747874684
3520793428
1774920624
- C++11
- Clang: ??
- GCC: 4.7.2 [mark verified]
- ICC: ??
- Visual C++: ??