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';
}
}