2016-12-13 3 views

答えて

0

実際にはありません。

std::binomial_distributionは、累積密度関数を提供できるものではなく、乱数生成用のアダプタです。

累積密度関数は、数行のコードで実装することも、数学ライブラリを検索することもできます。 (大きな階数を計算するのではなく、パスカルの三角形のアプローチを使用します)。

+0

階乗オーバーフローに問題がありました。再帰的な方法を使用しています。 https://en.wikipedia.org/wiki/Binomial_coefficient#Recursive_formula いいですか? –

+0

@Bathsheba:明示的に計算するのではなく、大量の無作為サンプリング/法則でそれを行うには、 'std :: binomial_distribution'を使って行うことができます。私はこれが両方の方法や何かをするOPの宿題の一部だと考えています。 –

0

Binomial

PMF(p, n,k) = n!/(k!*(n-k)!) p^k (1-p)^(n-k) 

良いトリックは階乗のlogにとっての対数と累乗それ

を計算することであるようにあなたは、ガンマ関数

のログを使用する必要があり、そのようなPMFを実装します

行に沿って(テストされていません)

double logChoose(int n, int k) { 
    return std::lgamma(double(n+1)) - std::lgamma(double(k+1)) - std::lgamma(double(n-k+1)); 
} 

double PMFBinomial(double p, int n, int k) { 
    double lgr = logChoose(n, k) + double(k)*std::log(p) + double(n-k)*std::log(1-p); 
    return std::exp(lgr); 
} 
関連する問題