Namespaces
Variants

std::mersenne_twister_engine<UIntType,w,n,m,r,a,u,d,s,b,t,c,l,f>:: mersenne_twister_engine

From cppreference.net
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
2) 使用种子值 value 构造引擎。给定 2 w
作为 p ,引擎的初始 状态 按以下方式确定:
  1. X -n 设为 value % p
  2. 对于区间 [ i - n , - 1 ] 内的每个整数 i ,将 X i 设为 [f·(X i-1 xor (X i-1 rshift (w-2)))+i mod n] mod p ,其中 xor rshift 分别表示内置的 按位异或 按位右移 运算符。
3) 使用种子序列 seq 构造引擎。给定 std:: size_t ( w / 32 ) + 1 作为 k ,引擎的初始 状态 按以下方式确定:
  1. 创建长度为 n * k 的虚构数组对象 a
  2. 调用 seq. generate ( a + 0 , a + n * k )
  3. 对于区间 [ - n , - 1 ] 内的每个整数 i ,将 X i 设为 (∑ k-1
    j=0
    a k(i+n)+j ·2 32j
    ) mod 2 w
  4. 如果 X -n 的最高 w − r 位为零,且其他所有生成的 X i 均为 0 ,则将 X -n 改为 2 w-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 调用所抛出的异常。

示例

#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 默认构造函数为显式 改为隐式

参阅

设置引擎的当前状态
(公开成员函数)