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ビットシードにはならない。その実装詳細であるWindowsのCryptGenRandom() APIやUNIX系OSの/dev/urandom自体は64ビットで読み込める。
シード生成の問題があるため、C++11とBoost 1.55.0時点では、ターゲット環境が64ビットならmt19937_64は高速に動作するので、そちらを使う。という、高速化のみに注目した選定基準でいいのかもしれない。