最終更新日時(UTC):
が更新

履歴 編集

type-alias
<random>

std::mt19937_64

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>

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

  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

処理系