特定の確率分布から (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 があり、おそらくパラメーターが固定されているという知識を使用してプロセスを簡素化できるからですか? ただの勝手な推測です。