陈默 2009年09月05日 星期六 21:13 | 2964次浏览 | 2条评论
学习笔记
射击至第k次命中的射击次数——负二项分布的随机数函数
即贝努利试验,该试验反复进行,成功的概率为p,直到第k次成功出现为止。
公式为:x=ln(r1*r2*...*rk)/lnq
注意:其中q=1-p,当第k次出现时,实际试验的次数为k+x次~~
//~ fuerxiang,负二项分布
double fuerxiang(double s,double q)
{
double t=1.0;
int i;
for(i=1;i<=s;i++) t*=rnd(1);
return log(t)/log(q);
}
模拟连续炮击同一目标,直到第10次命中为止,模拟所需射击次数的分布,程序运行一次,模拟1000个目标,命中率p从键盘输入。
模拟1000个目标,我个人觉得就是测试1000次,看每次测试时第多少炮第十次命中目标。
int main(int argc,char** argv)
{
static int a[51],i,k=10,n=1000,m;
double p,q,t;
rnd(-2);
printf("模拟炮击同一目标,直到第10次命中为止,所需的射击次数的分布:\n");
printf("请设定炮手的命中率:");
scanf("%lf",&p);q=1-p;
if(p>0 && p<1)
{
for(i=1;i<=n;i++)
{
t=fuerxiang(k,q);
m=(int)(t+k);//t+k才是真正命中10次时的总射击数
if(m>50) m=50;//超过50次才命中时,记为50
a[m]++;
}
}
for(k=10;k<50;k++) printf("射击%2d 发,10次命中,有%4d\n",k,a[k]);
rnd(-3);
return 0;
}
另,在linux下,如果你的程序中用到了math.h,那么在用gcc进行编译的时候,必须加上-lm选项,不然的话,就会出现:
undefined reference to `log'
等错误。。。
Turns out that -lm likes to be at the end of the command, not in with the LDFLAG
在生成参数最后的末尾加入-lm参数就好了~
Zeuux © 2024
京ICP备05028076号
回复 程旭元 2009年09月06日 星期日 02:11
回复 陈默 2009年09月06日 星期日 07:16