2012-01-30 6 views
-1

私は今一日Boost.Randomで遊んでいますが、boost::uniform_int_distribution<>はうまく動作しますが、boost::exponential_distribution<>で問題が発生しています。boost :: exponential_distributionを動作させるには?

#include <iostream> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/exponential_distribution.hpp> 

int main() { 
    boost::mt19937 gen; 
    boost::exponential_distribution<> dis; 
    std::cout << dis(gen) << "\n"; 
    return 0; 
} 

ブースト1.39.1を(いや、私はブーストをアップグレードすることはできません)を使用して、クラン3.0でコンパイル:

簡単なプログラムは、千個の言葉の価値があります。

出力は常に同じです:nanです。

報告された問題が見つかりませんでしたので、私はライブラリを正しく使用していないと思います。何か手がかりをいただければ幸いです。

+0

コードはgccの最新のboost(1.48)で私に '1.68591'を与えました(申し訳ありませんが、他の何かを助けることはできません)。 –

+0

@Jesse:テストしてくれてありがとう:) –

答えて

1

rが[0,1]に一様に分布すると、-log(r)は分布で(0、無限)に分布します。 前者はboost::uniform_01()です。

ディストリビューションp exp(-px)が必要な場合は、-(1/p)log(r)です。

ここで、log(x)は自然対数である(塩基番号e)。

UPD:boost::variate_generatorを使用すると、私のために働くように思われる(1.43を後押し):

#include <iostream> 
#include<boost/random.hpp> 

int main() { 
    boost::mt19937 rng(11u); 
    boost::variate_generator< boost::mt19937&, boost::exponential_distribution<> > rndm(rng, boost::exponential_distribution<>()) ; 
    std::cout<<rndm()<<"\n"; 
} 

でも、私は配布をチェックしませんでした。

+0

私は 'variate_generator'が動作することを確認します。今私は違いが何であるか理解していれば... –

+0

なぜそれがそうであるのか分かりません:-(私は個人的に私の答えからの変換を使用し、それで済むでしょう。 –

+0

私は今あなたのトリックを使用していましたが、私は 'variate_generator'ソースコードを見ています。シードしないのは、これはすべての実行で同じ出力を生成できるように、微調整私のアルゴリズムは、私がやった後は、いくつかの時間ベースの種子や何かを使用します。 –

関連する問題