泊松分布适合于描述单位时间(或空间)内随机事件发生的次数。如某一服务设施在一定时间内到达的人数,电话交换机接到呼叫的次数,汽车站台的候客人数,机器出现的故障数,自然灾害发生的次数,一块产品上的缺陷数,显微镜下单位分区内的细菌分布数等等。
观察事物平均发生m次的条件下,实际发生x次的概率P(x)可用下式表示:
松分布是离散型随机变量,其实还有更直接的算法。
首先科普一下,如果一个随机变量的概率分布函数(CDF)为,而,即u是[0,1]上的均匀分布,那么,即分布函数的逆函数在u处的值服从F所代表的分布。
因为泊松分布是离散的,所以特别好写,因为不涉及求复杂分布函数的逆函数的问题。
我用以上的思想自己写了一个C代码:
首先科普一下,如果一个随机变量的概率分布函数(CDF)为,而,即u是[0,1]上的均匀分布,那么,即分布函数的逆函数在u处的值服从F所代表的分布。
因为泊松分布是离散的,所以特别好写,因为不涉及求复杂分布函数的逆函数的问题。
我用以上的思想自己写了一个C代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int rand_p(double lambda);//生成随机数的主程序
double PDF(int lambda, int x);//计算概率密度函数
void main(){
int N=1000,lambda=30;//设置样本容量为N,lambda
int randnum;
double sum,sum2;
int i;
for (i=0;i<N;++i){
randnum=rand_p(lambda);//生成随机数
printf("%d\n",randnum);
sum+=randnum;//计算随机数的和
sum2+=pow(randnum,2);//计算随机数平方的和,为了计算方差
}
printf("The mean: %f\n",(double)sum/N);//计算平均
printf("The variance: %f\n",(double)sum2/N-pow((double)sum/N,2));//计算方差
}
int rand_p(double lambda){
double u=(double)rand()/RAND_MAX;//产生[0,1]的均匀分布
int x=0;
double cdf=exp(-1.0*lambda);//x=0时的分布函数值
while (u>=cdf){
x++;
cdf+=PDF(lambda,x);//更新概率分布函数
}
return x;
}
double PDF(int lambda, int k){
double pdf=1;
int i;
for (i=1;i<=k;++i)
pdf*=(double)lambda/i;
return pdf*exp(-1.0*lambda);
}