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
は高速に動作するので、そちらを使う。という、高速化のみに注目した選定基準でいいのかもしれない。