最終更新日時: 2025年10月23日 01時15分43秒 (JST)
Akira Takahashi が更新

履歴 編集

type-alias
<random>

# std::mt19937_64(C++11)

    namespace std {
      using mt19937_64 = mersenne_twister_engine<
          uint_fast64_t,
          64, 312, 156, 31,
          0xb5026f5aa96619e9, 29, 0x5555555555555555,17,
          0x71d67fffeda60000, 37, 0xfff7eee000000000, 43, 6364136223846793005
        >;
    }

## 概要

パラメータ設定済みの`mersenne_twister_engine`。
64ビット版のメルセンヌ・ツイスター。32ビット版は`mt19937`。

19937という名称は、メルセンヌ・ツイスター法によって生成される乱数列の周期から来ている(219937 - 1)。

この乱数生成器は、64ビット環境以上では、それ未満の環境に比べて高速に動作する。また、64ビット整数をシード値としてとれるため、32ビット版の`mt19937`に比べて、さらなる乱雑さを期待できる。

## 要件

`mt19937_64`型オブジェクトをデフォルト構築した場合、10000番目に生成される擬似乱数の値は`9981545732273789042`であること。

## 乱数列の周期

219937 - 1

## サイズ

    (312 + 1) * sizeof(uint_fast64_t)

メルセンヌ・ツイスターのシフトサイズ(312) + 現在の状態(1)。

## パフォーマンス

32ビット環境では、およそ`mt19937`より3倍近く遅い。

64ビット環境では、実装にもよるが32ビット環境以上に高速に動作する。

## 次元

311次元で一様分布する。

このトレードオフは、各出力の間(現在の状態と次の状態)の相関関係が、無視できるほどしかないということを意味する。たとえばN次元のランダムなベクトルを生成する場合、各次元の値に相関関係がほぼない状態にできる。

## シード、および生成される値の型

`uint_fast64_t`

## 例

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

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

      for (int i = 0; i < 10; ++i) {
        std::uint64_t result = engine();
        std::cout << result << std::endl;
      }
    }

### 出力例

    1621025592805379139
    4514793392314528655
    4543694396077351855
    3612539632838912606
    2625719985131503282
    3238788996565779147
    3317678171748965379
    12700229574828234289
    8869797388973705309
    9625202625077775903

## バージョン

### 言語

- C++11

### 処理系

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