4

劇的に異なる試行サイズ (ただし、ほとんどは小さい) の二項分布から多数の乱数をすばやく生成する必要があります。私は初心者のプログラマーであり、車輪の再発明が好きではないので、手動でアルゴリズムをコーディングする必要がないことを望んでいました (たとえば、11 月のこの関連ディスカッションを参照してください)。Boostは二項分布変量のジェネレーターを提供していないようですが、TR1GSL行う。どちらかを選択する正当な理由はありますか、それとも自分の状況に合わせてカスタマイズしたものを書く方がよいでしょうか? これが理にかなっているのかどうかはわかりませんが、プログラム全体で一様分布と二項分布から数値を生成することを交互に行い、それらが同じシードを共有し、オーバーヘッドを最小限に抑えたいと考えています。私が考慮すべきことについて、いくつかのアドバイスや例が欲しいです。

4

2 に答える 2

6

Boost 1.43 は二項分布をサポートしているようです。を使用boost::variate_generatorして、ランダム性のソースを、サンプリング元の分布のタイプに接続できます。

したがって、コードは次のようになります (免責事項: テストされていません!):

boost::mt19937 rng;                 // produces randomness out of thin air
                                    // see pseudo-random number generators
const int n = 20;
const double p = 0.5;
boost::binomial<> my_binomial(n,p);      // binomial distribution with n=20, p=0.5
                                         // see random number distributions
boost::variate_generator<boost::mt19937&, boost::binomial<> >
         next_value(rng, my_binomial);     // glues randomness with mapping
int x = next_value();                      // simulate flipping a fair coin 20 times
于 2010-05-07T20:51:12.723 に答える
2

Boost モデルを誤解しています。乱数ジェネレーターのタイプを選択してから、RNG が生成する値を分散させる分布を選択します。この回答には非常に単純な例があり、均一な分布を使用していますが、他の分布は同じ基本パターンを使用しています - ジェネレータと分布は完全に分離されています。

于 2010-05-07T21:21:02.457 に答える