- random[meta header]
- std[meta namespace]
- type-alias[meta id-type]
- cpp11[meta cpp]
namespace std {
using mt19937_64 = mersenne_twister_engine<
uint_fast64_t,
64, 312, 156, 31,
0xb5026f5aa96619e9, 29, 0x5555555555555555,17,
0x71d67fffeda60000, 37, 0xfff7eee000000000, 43, 6364136223846793005
>;
}
- mersenne_twister_engine[link mersenne_twister_engine.md]
- uint_fast64_t[link /reference/cstdint/uint_fast64_t.md]
パラメータ設定済みのmersenne_twister_engine
。
64ビット版のメルセンヌ・ツイスター。32ビット版はmt19937
。
19937という名称は、メルセンヌ・ツイスター法によって生成される乱数列の周期から来ている(219937 - 1)。
この乱数生成器は、64ビット環境以上では、それ未満の環境に比べて高速に動作する。また、64ビット整数をシード値としてとれるため、32ビット版のmt19937
に比べて、さらなる乱雑さを期待できる。
mt19937_64
型オブジェクトをデフォルト構築した場合、10000番目に生成される擬似乱数の値は9981545732273789042
であること。
219937 - 1
(312 + 1) * sizeof(uint_fast64_t)
- uint_fast64_t[link /reference/cstdint/uint_fast64_t.md]
メルセンヌ・ツイスターのシフトサイズ(312) + 現在の状態(1)。
32ビット環境では、およそmt19937
より3倍近く遅い。
64ビット環境では、実装にもよるが32ビット環境以上に高速に動作する。
311次元で一様分布する。
このトレードオフは、各出力の間(現在の状態と次の状態)の相関関係が、無視できるほどしかないということを意味する。たとえばN次元のランダムなベクトルを生成する場合、各次元の値に相関関係がほぼない状態にできる。
#include <iostream>
#include <random>
int main()
{
std::random_device seed_gen;
std::mt19937_64 engine(seed_gen());
for (int i = 0; i < 10; ++i) {
std::uint64_t result = engine();
std::cout << result << std::endl;
}
}
- std::mt19937_64[color ff0000]
- std::uint64_t[link /reference/cstdint/uint64_t.md]
- engine()[link mersenne_twister_engine/op_call.md]
1621025592805379139
4514793392314528655
4543694396077351855
3612539632838912606
2625719985131503282
3238788996565779147
3317678171748965379
12700229574828234289
8869797388973705309
9625202625077775903
- C++11
- Clang: ??
- GCC: 4.7.2
- ICC: ??
- Visual C++: ??