程序实现泊松随机分布

泊松分布适合于描述单位时间(或空间)内随机事件发生的次数。如某一服务设施在一定时间内到达的人数,电话交换机接到呼叫的次数,汽车站台的候客人数,机器出现的故障数,自然灾害发生的次数,一块产品上的缺陷数,显微镜下单位分区内的细菌分布数等等。
观察事物平均发生m次的条件下,实际发生x次的概率P(x)可用下式表示:
  松分布是离散型随机变量,其实还有更直接的算法。
首先科普一下,如果一个随机变量的概率分布函数(CDF)为F\left( x \right) ,而u\sim U[0,1],即u是[0,1]上的均匀分布,那么F^{-1} \left( u \right) \sim F,即分布函数的逆函数在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);
}
                                             




                                       





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值