C++求泊松分布

C++实现泊松分布

泊松分布公式

P ( X = k ) = e − λ λ k k ! P(X=k)=\frac{e^{-\lambda}\lambda^{k}}{k!} P(X=k)=k!eλλk
问题:直接用公式求会发生溢出

解决方法
方法一 用递推计算泊松分布值

P ( 0 ) = e x p ( − λ ) P(0)=exp(-\lambda) P(0)=exp(λ)
P ( k + 1 ) = λ P ( k ) k + 1 P(k+1)=\frac{\lambda P(k)}{k+1} P(k+1)=k+1λP(k)

代码大致为:

double result=exp(-lambda);
for(int i=1;i<k;i++)
	result*=(lambda/double(i))
方法二 C++11自带std::poisson_distribution
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
 
    // if an event occurs 4 times a minute on average
    // how often is it that it occurs n times in one minute?
    std::poisson_distribution<> d(4);
 
    std::map<int, int> hist;
    for(int n=0; n<10000; ++n) {
        ++hist[d(gen)];
    }
    for(auto p : hist) {
        std::cout << p.first <<
                ' ' << std::string(p.second/100, '*') << '\n';
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值