std::mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>:: mersenne_twister_engine
From cppreference.net
<
cpp
|
numeric
|
random
|
mersenne twister engine
|
mersenne_twister_engine
(
)
:
mersenne_twister_engine
(
default_seed
)
{
}
|
(1) | (自 C++11 起) |
|
explicit
mersenne_twister_engine
(
result_type value
)
;
|
(2) | (自 C++11 起) |
|
template
<
class
SeedSeq
>
explicit mersenne_twister_engine ( SeedSeq & seq ) ; |
(3) | (自 C++11 起) |
|
mersenne_twister_engine
(
const
mersenne_twister_engine
&
other
)
;
|
(4) |
(自 C++11 起)
(隐式声明) |
构造伪随机数引擎。
1)
默认构造函数。
-
若默认构造的引擎类型为
std::mt19937,其第10000次连续调用的生成值为 4123659995 。 -
若默认构造的引擎类型为
std::mt19937_64,其第10000次连续调用的生成值为 9981545732273789042 。
3)
使用种子序列
seq
构造引擎。给定
std::
size_t
(
w
/
32
)
+
1
作为
k
,引擎的初始
状态
按以下方式确定:
- 创建长度为 n * k 的虚构数组对象 a 。
- 调用 seq. generate ( a + 0 , a + n * k ) 。
-
对于区间
[- n,- 1]内的每个整数 i ,将 X i 设为 (∑ k-1
j=0 a k(i+n)+j ·2 32j
) mod 2 w
。 -
如果
X
-n
的最高
w − r
位为零,且其他所有生成的
X
i
均为
0
,则将
X
-n
改为
2
w-1
。
4)
复制构造函数。构造完成后,
*
this
==
other
为
true
。
目录 |
参数
| value | - | 用于初始化内部状态的种子值 |
| seq | - | 用于初始化内部状态的种子序列 |
复杂度
1,2)
O(n)
.
3)
与
seq.generate
调用的复杂度相同。
4)
O(n)
。
异常
示例
|
此章节内容不完整
原因:需要重载版本 (2-4) 的演示代码 |
运行此代码
#include <cassert> #include <random> int main() { std::mt19937 gen32; // overload (1) std::mt19937_64 gen64; // overload (1) gen32.discard(10000 - 1); gen64.discard(10000 - 1); assert(gen32() == 4123659995); assert(gen64() == 9981545732273789042ull); }
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2181 | C++11 |
重载
(
3
)
即使
seq.generate
调用抛出异常也不会抛出
|
传播该异常 |
| P0935R0 | C++11 | 默认构造函数为显式 | 改为隐式 |
参阅
|
设置引擎的当前状态
(公开成员函数) |