std::mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>::mersenne_twister_engine
来自cppreference.com
| |
(1) | (C++11 起) |
| |
(2) | (C++11 起) |
| |
(3) | (C++11 起) |
| |
(4) | (C++11 起) (隐式声明) |
构造伪随机数引擎。
1) 默认构造函数。
- 如果默认构造的引擎具有
std::mt19937类型,那么对它连续调用 10000 次产生的值是4123659995。 - 如果默认构造的引擎具有
std::mt19937_64类型,那么对它连续调用 10000 次产生的值是9981545732273789042。
2) 以种子值
为
value 构造引擎。给定 2w为
p,引擎的初始状态通过以下方式确定:
- 将 X-n 设为
value % p。 - 对于
[i - n,-1]中的每个整数i,将 Xi 设为 [f·(Xi-1 xor (Xi-1 rshift (w-2)))+i mod n] mod p,其中 xor 和 rshift 分别表示内建的逐位异或和向右移位。
3) 以种子序列
seq 构造引擎。给定 std::size_t(w / 32) + 1 为 k,引擎的初始状态通过以下方式确定:
- 创建一个长度是
n * k的虚设数组对象。 - 调用
seq.generate(a + 0, a + n * k)。 - 对于
[-n,-1]中的每个整数i,将 Xi 设为 (∑k-1
j=0 ak(i+n)+j·232j
) mod 2w
。 - 如果 X-n 的最高
w − r位为零,并且其他的结果 Xi 也都是0,那么将 X-n 改为 2w-1
。
此重载只有在
SeedSeq 满足种子序列 (SeedSequence) 的要求时才会参与重载决议。4) 复制构造函数。构造完成时
*this == other 是 true。参数
| value | - | 用于内部状态初始化的种子值 |
| seq | - | 用于内部状态初始化的种子序列 |
复杂度
1,2) O(n)。
3) 与
seq.generate 调用的复杂度相同。4) O(n)。
异常
3) 如果
SeedSeq 不是 std::seed_seq,那么就会抛出 seq.generate 调用抛出的异常。示例
| 本节未完成 原因:demos for overloads (2-4) required |
运行此代码
#include <cassert>
#include <random>
int main()
{
std::mt19937 gen32; // 重载 (1)
std::mt19937_64 gen64; // 重载 (1)
gen32.discard(10000 - 1);
gen64.discard(10000 - 1);
assert(gen32() == 4123659995);
assert(gen64() == 9981545732273789042ull);
}
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2181 | C++11 | 即使 seq.generate 调用抛出了异常,重载 (3) 也不会抛出异常
|
会传播该异常 |
| P0935R0 | C++11 | 默认构造函数是显式的 | 改成隐式的 |
参阅
| 设置引擎的当前状态 (公开成员函数) |