パソコン・メモメモ備忘録

気の向くままパソコン関係等で気になることを書き記す。時々更新!

boostのメルセンヌツイスター

無知な私のメモ。

乱数が欲しくなったので、MersenneTwisterを使ってみようと調べた。boost はすでに入れているので、boost/ramdom.hpp を使うのが楽そう.. と思ったのだが使い方がさっぱり。あるクラスのメンバに乱数発生器として持たせ、そのクラスのメソッド内で使うという状況だったのだが。ということでとりあえず動いているように見える所まではきたので、結果をメモメモ。

内容は良くわからないが、Webを色々探索した所によると、メンバとしては、
boost::mt19937 m_RandEngine;

boost::variate_generator > m_RandomGenerator;
を持たせておく。mt199937 というのは MersenneTwister のあるパラメータ設定。きっと偉い人が良さげなパラメータを用意してくれているのだと信じて(^^
uniform_real<> は均等に分布する実数の乱数を生成するってことだと信じて(^^

で、variate_generator は、ある初期化パラメータを持つコンストラクトを要求する(デフォルトコンストラクタが用意されて無い(private))ところがポイント。これをメンバとして持っているクラスのコンストラクタのメンバ初期化部(正式名称なんだろ)で初期化する必要がある(逆に言えば、そこで初期化すれば、デフォルトコンストラクタが無いクラスのオブジェクトをメンバに持てる。というのを始めて知ったかも)。
class NiGHTS : m_RandomGenerator(m_RandEngine, boost::uniform_real<>(0,1))
そして、
mRandomGenerator() ってやると、次々0から1までの乱数が返ってくると。

あいかわらず、variate_generator の宣言の > > の間に空白等を入れないでエラーを出してしまったのはひ・み・つ。

シードも設定したければ、メンバ初期化列で m_RandEngine もなんかで初期化すべきって事でしょうか。この辺は更なる調査必要。