求一泊松分布的c++程序P{X=k}= (λ“-k" e"-λ")/k!k =0,1,2… λ >0; 0 λ

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 00:34:15
求一泊松分布的c++程序P{X=k}= (λ“-k0; 0 λ" />

求一泊松分布的c++程序P{X=k}= (λ“-k" e"-λ")/k!k =0,1,2… λ >0; 0 λ
求一泊松分布的c++程序
P{X=k}= (λ“-k" e"-λ")/k!k =0,1,2… λ >0;
0 λ

求一泊松分布的c++程序P{X=k}= (λ“-k" e"-λ")/k!k =0,1,2… λ >0; 0 λ
大致有三种方法:
第一种:直接生成
记 F_0 = e^(-lamda)
F_n = p_0 + p_1 + ...+ p_n
其中 p_n = P( X = n )
然后
1.随机生成一个[0,1]区间上的随机数ran
2.如果ran < F_0,令 x = 0
3.如果存在某一个值k使得 F_(k-1)< ran < F_k,令 x=k
x就是所要生成的泊松随机数
第二种:分数乘积法
当lamda非常大的时候相当复杂,不提也罢
第三种:中心极限定理近似
1.生成随机数ran
2.计算相应的标准正态随机数nor
3.计算poi = lamda + nor * (lamda^(1/2))
4.取与poi 最接近的非负整数作为所要生成的泊松随机数
给你一个具体的吧:
为了产生泊松分布抽样间隔,首先需要决定抽样的参数λ,例如平均抽样间隔是30 秒,时间单位为秒,那么λ=30,θ=1/30 .然后,产生一系列指数分布的(伪)随机数E1,E2,…,En,…,第一次抽样的时刻为E1,第二次抽样的时刻为E1+E2 等等,依此类推.
一种生成指数分布的(伪)随机数Ei 的方法:在0 和1 之间产生均匀分布的U1,U2,…,Un,…(伪) 随机数,利用这些Ui 值,产生所需要的Ei 值:
#include "math.h"
//
double Poisson(double lambda,long nSeed)
{
double u = Uniform(0.0,1.0,&nSeed);
double fRet = log(u) * (-1) *lambda;
if(fRet < 1.0)
{
return Poisson(lambda,++nSeed);
}
return fRet;
}