mersenne_twister クラス

更新 : 2007 年 11 月

メルセンヌ ツイスタ アルゴリズムでランダム シーケンスを生成します。

template<class UIntType,
   int W, int N, int M, int R,
   UIntType A, int U, int S,
   UIntType B, int T, UIntType C, int L>
   class mersenne_twister {
public:
      typedef mersenne_twister<UIntType, W, N, M, R,
            P, U, S, B, T, C, L> _MyT;
   typedef UIntType result_type;
   static const int word_size = W;
   static const int state_size = N;
   static const int shift_size = M;
   static const int mask_bits = R;
   static const int UIntType parameter_a = A;
   static const int output_u = U;
   static const int output_s = S;
   static const UIntType output_b = B;
   static const int output_t = T;
   static const UIntType output_c = C;
   static const int output_l = L;
      static const UIntType default_seed = 5489U;
   explicit mersenne_twister(unsigned long x0 = default_seed);
   mersenne_twister(const mersenne_twister& right);
      mersenne_twister(mersenne_twister& right);
   template<class Gen>
      mersenne_twister(Gen& gen);
   void seed(unsigned long x0 = default_seed);
   template<class Gen>
      void seed(Gen& gen);
   result_type min() const;
   result_type max() const;
   result_type operator()();
    };

パラメータ

  • UIntType
    結果を表す符号なし整数型。

  • W
    W エンジン パラメータ。

  • N
    N エンジン パラメータ。

  • R
    R エンジン パラメータ。

  • A
    A エンジン パラメータ。

  • U
    U エンジン パラメータ。

  • S
    S エンジン パラメータ。

  • B
    B エンジン パラメータ。

  • T
    T エンジン パラメータ。

  • C
    C エンジン パラメータ。

  • L
    L エンジン パラメータ。

解説

このテンプレート クラスは単体エンジンを表します。このエンジンは、W * (N - 1) + R ビットの大きな整数値を保持します。この大きな値から一度に W ビットを抽出し、すべてのビットを使用し尽くすと、ビットをシフトし、混ぜ合わせることにより大きな値に "ひねり" を加えて、抽出元となる新しいビットの集合を作成します。エンジンの状態は、operator() が少なくとも N 回呼び出された場合は、最後に使用された NW ビットの値になります。それ以外の場合は、使用された MW ビットの値およびシードの最後の N - M の値になります。

テンプレート引数 UIntType には、最大 2W - 1 の値を保持するのに十分な大きさが必要です。その他のテンプレート引数の値は、次の要件を満たしている必要があります。

0 < M <= N

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

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

W * (N - 1) + R がメルセンヌ素数であること。

ジェネレータが、次のコードを実行することによって、保持している大きな値にひねりを加えること。

    for (int i = 0; i < N; ++i)
        {
        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 (int i = 0; i < N; ++i)
            x[i] = y[i];

LMASK は、下位 R ビットが 1 に設定され、それ以外のビットが 0 に設定された、符号なし W ビットの値を表します。HMASK は、LMASK の補数を表します。

このジェネレータは、0 に初期化された現在のインデックス idx を保持し、次のコードを実行することによってビットを抽出します。

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

idx が N に達すると、ジェネレータは、格納されている値にひねりを加え、idx を 0 に戻します。

必要条件

ヘッダー : <random>

名前空間 : std::tr1

参照

参照

<random>

mersenne_twister クラス