8

特定の確率分布から (1,000,000)^2 の数値を生成し、それらに対して何かを行うシミュレーションを C++ で作成しました。これまで、指数分布、正規分布、ガンマ分布、一様分布、およびポアソン分布を使用してきました。そのうちの 1 つのコードを次に示します。

#include <boost/random.hpp>

...main...

    srand(time(NULL)) ;
    seed = rand();
    boost::random::mt19937 igen(seed) ;
    boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> >
    norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ;

ここで、ベータ ディストリビューション用に実行する必要があります。これまでに行ったすべての配布には、10 ~ 15 時間かかりました。ベータ ディストリビューションはブースト/ランダム パッケージに含まれていないため、ブースト/数学/ディストリビューション パッケージを使用する必要がありました。解決策を提案するStackOverflow でこのページを見つけました。ここにあります(コピーペースト):

#include <boost/math/distributions.hpp> 
using namespace boost::math;  
double alpha, beta, randFromUnif;  
//parameters and the random value on (0,1) you drew  
beta_distribution<> dist(alpha, beta); 
double randFromDist = quantile(dist, randFromUnif); 

私はそれを複製し、それはうまくいきました。シミュレーションの実行時間の見積もりは線形であり、正確に予測できます。彼らは、これが 25 日間実行されると言います。2 つの可能性があると思います: 1. 提案された方法は、以前に他のディストリビューションで使用していた方法よりも劣っています。 2. ベータ版のディストリビューションは、乱数を生成するのがはるかに困難です。

私は C++ コーディングについて最低限の理解しか持っていないので、私が尋ねている質問はばかげているかもしれません。このシミュレーションが完了するまで 1 か月も待ちきれません。それを改善するために何かできることはありますか? おそらく、私が使用していた最初の方法を使用して、boost/math/distributions パッケージで動作するように変更しますか? それが可能かどうかさえわかりません。

役に立つかもしれないもう 1 つの情報は、生成する必要があるすべての (1,000,000)^2 の数値でパラメーターが同じであることです。私がこれを言っているのは、ベータ版のディストリビューションには厄介な PDF があり、おそらくパラメーターが固定されているという知識を使用してプロセスを簡素化できるからですか? ただの勝手な推測です。

4

3 に答える 3

5

ベータ分布はガンマ分布に関連しています。X を Gamma(α,1) から引き出された乱数、Y を Gamma(β,1) から引き出された乱数とします。ここで、ガンマ分布の最初の引数は形状パラメーターです。このとき、Z=X/(X+Y) は分布 Beta(α,β) を持ちます。この変換では、ガンマ分布テストの 2 倍の時間しかかかりません。

注:上記は、ガンマ分布の最も一般的な表現である Gamma(shape,scale) を想定しています。ガンマ分布ランダム ジェネレーターの実装によって、引数の意味と順序が異なることに注意してください。

于 2012-04-27T23:13:45.330 に答える
0

最適化してコンパイルしてみてください。フラグ -O3 を使用すると、通常は速度が上がります。詳細については、最適化フラグに関するこの投稿またはこの概要を参照してください。

于 2012-04-27T21:43:56.550 に答える