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

来自cppreference.com
 
 
 
 
 
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 构造引擎。给定 2w
为 p,引擎的初始状态通过以下方式确定:
  1. 将 X-n 设为 value % p。
  2. 对于 [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,引擎的初始状态通过以下方式确定:
  1. 创建一个长度是 n * k 的虚设数组对象。
  2. 调用 seq.generate(a + 0, a + n * k)。
  3. 对于 [-n, -1] 中的每个整数 i,将 Xi 设为 (∑k-1
    j=0
    ak(i+n)+j·232j
    ) mod 2w
    。
  4. 如果 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 调用抛出的异常。

示例

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

参阅

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