STLのシャッフルアルゴリズムstd::random_shuffleの乱数にBoost/random.hppを使う
C++の標準ライブラリSTLに入ってるシャッフルを使いたいんだけど,ちゃんとした乱数を使いたいってことでboostを使ってみることにした.
コードはいつものようにsnipplrに:
http://snipplr.com/view/5907/stdrandomshuffle-and-boostrandomhpp/
C++はちゃんと勉強せずにプログラムを書いたり読んだりしてるだけなので,変な所があるかもしれない.
参考(というか↓を組み合わせたら↑になるんだけどねw):
このプログラムはちょっとおかしいところがあります。
Random::operator()は、引数argを使って、0からarg-1までの乱数を出力することになっています。このプログラムではargに依らず0からNまでの乱数を返しています。random_shuffleの要請に答えていません。
具体的には次の不具合がおきます。
- rndが10を返したとき、myvector[10]という確保されていない領域にアクセスする。
— uniform_int(0, N – 1)にすると直ります。
- random_shuffleの結果が偏る。
— 長さを3にして100回程度同じ実験をして頻度を見ると、出やすい配列と出にくい配列があるのがわかります。
正しいコードは例えば次のページの解答にあります。
http://stackoverflow.com/questions/147391/using-boostrandom-as-the-rng-for-stdrandomshuffle
とおりすがりで失礼しました。
Gus
August 30, 2009 at 9:39 am
> Random::operator()は、引数argを使って、0からarg-1までの乱数を出力することになっています。
ここにそう書いてありますね.
http://www.boost.org/doc/libs/1_40_0/libs/random/random-distributions.html#uniform_int
ご指摘ありがとうございます.
tkf
August 30, 2009 at 10:00 am