私は、特定の確率分布から(1,000,000)^ 2個の数字を生成し、それらを使って何かを行うC++でシミュレーションを書いた。これまでは、指数関数、標準、ガンマ、ユニフォーム、ポアソン分布を使ってきました。Betaディストリビューションの乱数、C++
#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時間かかりました。 Betaディストリビューションはboost/randomパッケージにはないので、boost/math/distributionパッケージを使用しなければなりませんでした。解決策を提案したthis page on 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日間実行されると言います。 1.提案された方法は、私が以前使っていたものに劣っている他のディストリビューションのための 2.ベータ分布はちょうど私が以下の最低限の持っている心の中で
ベアから乱数を生成することが非常に困難である:私は2つの可能性を参照してくださいC++のコーディングの理解、私が求めている質問はばかげているかもしれません。私はこのシミュレーションが完了するまで1ヶ月待つことができないので、改善するために何かできることはありますか?おそらく私が使用していた初期の方法を使ってboost/math/distributionsパッケージで動作するように修正するのでしょうか?それが可能かどうかわからない。
役に立つ情報のもう1つの情報は、生成する必要があるすべての(1,000,000)^ 2の数値のすべてが同じであるということです。私はこれを言っています。なぜなら、Betaディストリビューションには厄介なPDFがあり、おそらくパラメータが固定されているという知識が、プロセスを単純化するために何らかの形で使用できるからです。ちょっとランダムな推測。
ありがとう、私はその財産を知らなかった。また、ガンマ分布は単に指数関数の和であるという事実を使用しました。あなたの提案は、実行時間を600時間から40時間に変更しました。ありがとうございました! – jaff
ガンマ(1、α)とガンマ(1、β)の代わりにガンマ(α、1)とガンマ(β、1)を使用しないでください。つまり、αとβは、スケールパラメータではなく形状パラメータでなければなりません。 – BenRI
@BenRI - ガンマ分布をパラメータ化する方法は複数あります。より広く使用されているものの1つは 'gamma(shape_factor、scale_factor)'です。この使い方では正しいです。そのスケールファクタは、レートまたは平均であってもよい。他のものは、第2引数として形状を指定します(しかしこれは明らかに広く使われていません)。より一般的な表記法を反映させ、形状引数がキーであることを示すために私の答えを更新します。 –