使用 std::binomial_distribution 计算概率
Calculating probability using std::binomial_distribution
是否可以使用std::binomial_distribution计算k次试验中n次成功的概率?怎么样?
不是真的没有。
std::binomial_distribution
更像是随机数生成的适配器,而不是可以提供累积密度函数的东西。
您可以自己用几行代码实现累积密度函数,或者搜索一个好的数学库。 (使用帕斯卡三角法而不是计算大的阶乘数)。
实现这样的PMF,喜欢Binomial
PMF(p, n,k) = n!/(k!*(n-k)!) p^k (1-p)^(n-k)
好技巧是计算它的对数并取幂
对于 log
的阶乘,您必须使用伽玛函数的对数
沿线(未测试!)
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);
}
是否可以使用std::binomial_distribution计算k次试验中n次成功的概率?怎么样?
不是真的没有。
std::binomial_distribution
更像是随机数生成的适配器,而不是可以提供累积密度函数的东西。
您可以自己用几行代码实现累积密度函数,或者搜索一个好的数学库。 (使用帕斯卡三角法而不是计算大的阶乘数)。
实现这样的PMF,喜欢Binomial
PMF(p, n,k) = n!/(k!*(n-k)!) p^k (1-p)^(n-k)
好技巧是计算它的对数并取幂
对于 log
的阶乘,您必须使用伽玛函数的对数
沿线(未测试!)
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);
}