ナンクル力学系

学んだ事を書き連ねていこう。

STLのシャッフルアルゴリズムstd::random_shuffleの乱数にBoost/random.hppを使う

with 2 comments

C++の標準ライブラリSTLに入ってるシャッフルを使いたいんだけど,ちゃんとした乱数を使いたいってことでboostを使ってみることにした.

コードはいつものようにsnipplrに:

http://snipplr.com/view/5907/stdrandomshuffle-and-boostrandomhpp/

C++はちゃんと勉強せずにプログラムを書いたり読んだりしてるだけなので,変な所があるかもしれない.

参考(というか↓を組み合わせたら↑になるんだけどねw):

Advertisements

Written by tkf

April 19, 2008 at 1:34 pm

Posted in programming

Tagged with , ,

2 Responses

Subscribe to comments with RSS.

  1. このプログラムはちょっとおかしいところがあります。

    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

  2. > 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


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: