mersenne_twister_engine Class

由Mersenne扭转项算法生成一个随机顺序。

template<class UIntType,
   size_t W, size_t N, size_t M, size_t R,
   UIntType A, size_t U,
   UIntType D, size_t S,
   UIntType B, size_t T,
   UIntType C, size_t L
   UIntType F>
class mersenne_twister_engine {
public:
   typedef UIntType result_type;
   static const size_t word_size = W;
   static const size_t state_size = N;
   static const size_t shift_size = M;
   static const size_t mask_bits = R;
   static const UIntType xor_mask = A;
   static const size_t tempering_u = U;
   static const size_t tempering_d = D;
   static const size_t tempering_s = S;
   static const UIntType tempering_b = B;
   static const size_t tempering_t = T;
   static const UIntType tempering_c = C;
   static const size_t tempering_l = L;
   static const UIntType initialization_multiplier = C;
   static const result_type default_seed = 5489U;
   explicit mersenne_twister_engine(unsigned long x0 = default_seed);
   explicit mersenne_twister_engine(seed_seq& seq);
   void seed(unsigned long x0 = default_seed);
   template<class Gen>
      void seed(seed_seq& seq);
   result_type min() const;
   result_type max() const;
   result_type operator()();
   void discard(unsigned long long count)();
   };

参数

  • UIntType
    无符号整数结果类型。

  • W
    W引擎参数。

  • N
    N引擎参数。

  • M
    M引擎参数。

  • R
    R引擎参数。

  • A
    A引擎参数。

  • U
    U引擎参数。

  • D
    D引擎参数。

  • S
    引擎的参数。

  • B
    B引擎参数。

  • T
    T引擎参数。

  • C
    C引擎参数。

  • L
    L引擎参数。

  • F
    F引擎参数。

备注

此模板选件类描述 <random>。它表示与 W * (N - 1) + R 位的一个大整数值。它从此最大值一次提取 W 位,因此,在使用了所有位时它通过转换和组合位扭转最大值,以使其具有一组新的提取自。引擎处理状态是最后 NW-位值使用的,如果 operator() 调用至少 N 时,否则 MW-使用的位值。个种子的最后一 N - M 值。

模板参数 UIntType 必须足够大表示值到 2W - 1。其他模板参数的值必须满足以下要求:

1 < M <= N

0 <= R, U, S, T, L <= W

0 <= A, B, C <= 2W - 1

W * (N - 1) + R 必须是Mersenne最初

生成器扭转它通过执行以下代码表示的最大值:

    for (size_t i = 0; i < N; ++i)
        {    // twist
        temp = (x[i] & LMASK) << (W - 1) | (x[i + 1] & HMASK) >> 1;
        if (temp & 1)
            y[i] = (temp >> 1) ^ A ^ x[(i + R) % N];
        else
            y[i] = (temp >> 1) ^ x[(i + R) % N];
        }
        for (size_t i = 0; i < N; ++i)
            x[i] = y[i];

其中 LMASK 是无符号 W-将其左上角 R 位设置为1其余部分的位值其位设置为0 HMASK 是 LMASK的补充。

生成器保存当前索引 idx 初始化为0。它通过执行以下代码提取位:

    temp = x[idx++];
    temp = temp ^ ((temp >> U) & D);
    temp = temp ^ ((temp << S) & B);
    temp = temp ^ ((temp << T) & C);
    temp = temp ^ (temp >> L);

当 idx 到达 N 时生成器扭转该存储的值并将 idx 为0。

要求

标头: <random>

命名空间: std

请参见

参考

<random>

mersenne_twister_engine::discard

mersenne_twister_engine::mersenne_twister_engine

mersenne_twister_engine::operator()

mersenne_twister_engine::seed