64ビット版メルセンヌ・ツイスターはいつ使うか

C++11標準ライブラリとBoost.Randomには、32ビット版メルセンヌ・ツイスターmt19937と64ビット版のmt19937_64があって、64ビット版をいつ使えばいいかよくわからなかったのでメモ。

What is the advantage of using mt19937_64 over its 32 bit variant? - StackOverflow

  • 64ビット版は、より大きな幅(64ビット)のシードを持つことができる。
    • これによって、乱雑さがさらに増す。
  • CPUの64ビット命令を使うので、64ビットマシンなら速く動作して、32ビットマシンなら遅い。
  • sizeofはどちらも同じ。

ただし、random_deviceクラスは32ビット(unsigned int)の値を作るので、それをそのままシードとして使う場合は、64ビットシードにはならない。その実装詳細であるWindowsCryptGenRandom() APIUNIX系OS/dev/urandom自体は64ビットで読み込める。

シード生成の問題があるため、C++11とBoost 1.55.0時点では、ターゲット環境が64ビットならmt19937_64は高速に動作するので、そちらを使う。という、高速化のみに注目した選定基準でいいのかもしれない。