递归实现二项分布:
public static double binomial(int N,int k,double p){
if(N==0&&k==0)
return 1.0;
if(N<0||k<0)
return 0.0;
return (1-p)*binomial(N-1,k,p)+p*binomial(N-1,k-1,p);
}
原理: (N,k)p^k*(1-p)^(N-k)=(1-p)[(N-1,k)p^k*(1-p)^(N-1-k)]+p[(N-1,k-1)p^(k-1)*(1-p)^(N-k)]
问题: 当参数中int过大时,递归调用次数较多,花费时间较长
改进实现(放弃递归):
public static double binomial(int N,int k,double p){
int m=1,s=1;
for(int i=N;i>(N-k);i--)
m*=i;
for(int j=k;j>0;j--)
s*=j;
return m/s*Math.pow(p, k)*Math.pow((1-p), (N-k));
}
原理:P(ξ=k)=C(N,k)*p^k*(1-p)^(n-k)