最終更新日時: 2026年05月18日 13時21分35秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<random>

# std::mersenne_twister_engine(C++11)

    namespace std {
      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;

      using mt19937    = …;
      using mt19937_64 = …;
    }

## 概要

`mersenne_twister_engine`クラスは、メルセンヌ・ツイスター法による擬似乱数生成エンジンである。

メルセンヌ・ツイスター法は、以下のような特徴を持つ：

1. 非常に長い周期を持つ。
2. 非常に大きな次元で均等分布する。(`n`次元…パラメータ設定済み別名である`mt19937`では623次元)
   - これは内部的に、大きな配列(領域)を保持することを意味する。空間的に余裕がある場合にこのエンジンを選択する。

テンプレートパラメータは、以下を意味する：

- `UIntType` : 生成する符号なし整数の型。標準もしくは拡張の符号なし整数型 (ビット幅が`short`以上`long long`以下) 、または処理系定義のサブセットの符号なし整数型でなければならない。
- `w` : ワードサイズ。状態シーケンス内での各ワードのビット数。`numeric_limits<UIntType>::digits`以下にするのがよい。
- `n` : 状態のサイズ。状態シーケンスの要素数。生成される値が再発する程度を調整するための値。
- `m` : シフトサイズ。各ひねり(twist)時にシーケンスから選択する他の値が、`m`要素離れるようにする。`n`より小さくするのがよい。
- `r` : マスクのビットサイズ。各ひねりに対する分離ポイントのマスクサイズ。`w`よりも小さくするのがよい。
- `a` : XORのマスク。各ひねりに対して、線形関数としてXORする値。`1u << w`よりも小さくするのがよい。
- `s, t, u, l` : 調律シフトのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のシフト値。`w`よりも小さくするのがよい。
- `b, c, d` : 調律ビットマスクのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のビットマスク値。`1u << w`以下にするのがよい。
- `f` : 初期化の乗数。ひとつの値をシードとする際の、状態シーケンスのシードとして使用する初期化乗数。

これらは以下の関係式を満たなければならない:

- `0 < m`
- `m <= n`
- `2u < w`
- `r <= w`
- `u <= w`
- `s <= w`
- `t <= w`
- `l <= w`
- `w <= std::numeric_limits<UIntType>::digits`
- `a <= (1u << w) - 1u`
- `b <= (1u << w) - 1u`
- `c <= (1u << w) - 1u`
- `d <= (1u << w) - 1u`
- `f <= (1u << w) - 1u`

## メンバ関数

### 構築・シード

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`~mersenne_twister_engine() = default;` | デストラクタ | C++11
`seed` | シードを設定する | C++11

### 生成

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator()` | 擬似乱数を生成する | C++11
`discard` | 指定した回数だけ擬似乱数を生成し、内部状態を進める | C++11

## 静的メンバ関数

### エンジンの特性

名前 | 説明 | 対応バージョン
--- | --- | ---
`min` | 生成し得る値の最小値を取得する | C++11
`max` | 生成し得る値の最大値を取得する | C++11

## メンバ型

型 | 説明 | 対応バージョン
--- | --- | ---
`result_type` | 擬似乱数生成結果の符号なし整数型 `UIntType`。 | C++11

## メンバ定数

定数 | 説明 | 対応バージョン
--- | --- | ---
`static constexpr size_t word_size` | ワードサイズ。状態シーケンス内での各ワードのビット数。テンプレートパラメータ`w`。 | C++11
`static constexpr size_t state_size` | 状態のサイズ。状態シーケンスの要素数。生成される値が再発する程度を調整するための値。テンプレートパラメータ`n`。 | C++11
`static constexpr size_t shift_size` | シフトサイズ。各ひねり(twist)時にシーケンスから選択する他の値が、`m`要素離れるようにする。テンプレートパラメータ`m`。 | C++11
`static constexpr size_t mask_bits` | マスクのビットサイズ。各ひねりに対する分離ポイントのマスクサイズ。テンプレートパラメータ`r`。 | C++11
`static constexpr UIntType xor_mask` | XORのマスク。各ひねりに対して、線形関数としてXORする値。テンプレートパラメータ`a`。 | C++11
`static constexpr size_t tempering_u` | 調律シフトのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のシフト値。テンプレートパラメータ`u`。 | C++11
`static constexpr UIntType tempering_d` | 調律ビットマスクのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のビットマスク値。テンプレートパラメータ`d`。 | C++11
`static constexpr size_t tempering_s` | 調律シフトのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のシフト値。テンプレートパラメータ`s`。 | C++11
`static constexpr UIntType tempering_b` | 調律ビットマスクのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のビットマスク値。テンプレートパラメータ`b`。 | C++11
`static constexpr size_t tempering_t` | 調律シフトのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のシフト値。テンプレートパラメータ`t`。 | C++11
`static constexpr UIntType tempering_c` | 調律ビットマスクのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のビットマスク値。テンプレートパラメータ`c`。 | C++11
`static constexpr size_t tempering_l` | 調律シフトのパラメータ。生成アルゴリズムによって使用される、ごちゃ混ぜ処理のシフト値。テンプレートパラメータ`l`。 | C++11
`static constexpr UIntType initialization_multiplier` | 初期化の乗数。ひとつの値をシードとする際の、状態シーケンスのシードとして使用する初期化乗数。テンプレートパラメータ`f`。 | C++11
`static constexpr result_type default_seed` | デフォルトのシード値。`5489u` | C++11

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++11
`operator!=` | 非等値比較 | C++11
`operator<<` | ストリームへの出力 | C++11
`operator>>` | ストリームからの入力 | C++11

## 例

    #include <iostream>
    #include <random>
    #include <cstdint>

    int main()
    {
      std::random_device seed_gen;
      std::uint32_t seed = seed_gen();

      // mersenne_twister_engineのパラメータ設定済み別名であるmt19937を使用する。
      // ランダムなシードを使用して初期化
      std::mt19937 engine(seed);

      for (int i = 0; i < 10; ++i) {
        // 乱数を生成
        std::uint32_t result = engine();

        std::cout << result << std::endl;
      }
    }

### 出力例

    1947293914
    2297418245
    2457279642
    1103462493
    1989850974
    803886008
    4019141122
    4235051204
    208651936
    1880689761

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.2 ✅
- ICC: ??
- Visual C++: ??

## 参照

- Mersenne Twister Home Page
- メルセンヌ・ツイスタ - Wikipedia
- GCC(libstdc++) 4.8以降では、`<ext/random>`ヘッダに、SSE最適化されたメルセンヌ・ツイスターである`simd_fast_mersenne_twister_engine`クラスが実装されている
- P4037R1 Supporting `signed char` and `unsigned char` in random number generation
  - `UIntType`テンプレートパラメータの要件が明文化された（拡張符号なし整数型および処理系定義のサブセットを許容）。この仕様はC++26から導入されたが、仕様の欠陥を修正したものであるためコンパイラは早期に対応している場合がある