陈默

陈默的博客

他的个人主页  他的博客

090905负二项分布的随机数函数

陈默  2009年09月05日 星期六 21:13 | 2835次浏览 | 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哲思注册吗?现在 注册 !
程旭元

回复 程旭元  2009年09月06日 星期日 02:11

明儿我去试试eclipse里是不是也得加-lm

这个日志怎么会有这么多访客啊。

1条回复

  • 陈默

    回复 陈默  2009年09月06日 星期日 07:16

    我咋知道。。。我一大早被小墨吵醒了,我狠郁闷

    0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号