C语言生成符合泊松分布(离散型)的随机数(手写)

     首先明确泊松分布的定义,泊松分布属于离散型随机分布,针对离散型随机分布类型的随机数产生,需要从其定义下手(连续性随机变量是利用反函数来进行推导,下一篇文章会介绍)

接下来请您根据文字和对应的解释图来进行理解。

      泊松分布大致意思是在单位时间内事件发生次数,那么我们首先定义一个时间t,在时间t中发生的次数为n,概率为p,那我们想要得到单位时间内发生的次数就要把这个时间t进行拆分,拆分到单位时间内发生的次数小于等于1,这样的话当t很大的时候,当拆分成单位时间时,事件在单位时间内发生的次数概率p会非常小,近似于0,这里的0值一般认为是e-i次方,是我们要设定的单位时间内的平均发生次数。所以在实现的时候,我们要产生一个小于1大于0的随机数,当这个随机数p1大于e-i次方的时候表示t还没有被拆分成单位时间,这时就再乘一个随机数p2表示在t的基础上再进行拆分,得到的p1*p2再与e-i次方相对比,知道小于e-i次方。而在这个过程中拆分的次数就会满足泊松分布,将这些次数进行区间划分求频率,得到的图像就是泊松分布图,i的取值决定泊松的最高点对应的x值。

效果图

x轴是区间,y是频率(区间的确定在下面代码里)

这里留下泊松的c代码,代码不是很规范,看意思就好。。。(sorry)

//c语言代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

int main()
{

    srand((unsigned)time(NULL));//种子

 
    int possion(int probaility);//probaility表示单位时间的平均次数,或者说分布图最高点对应的x值
    int aa[10]={0};//存放频率
    int a;
    for(int i=0;i<1000;i++){

       a = possion(5);
       if(a<1){aa[0]++;}
       else if(a==1){aa[1]++;}
       else if(a==2){aa[2]++;}
       else if(a==3){aa[3]++;}
       else if(a==4){aa[4]++;}
       else if(a==5){aa[5]++;}
       else if(a==6){aa[6]++;}
       else if(a==7){aa[7]++;}
       else if(a==8){aa[8]++;}
       else{aa[9]++;}

    }
    for(int j=0;j<10;j++){
        printf("%d\n",aa[j]);
    }


    return 0;
}


int possion(int probaility){
    double p = 1.0;//初始p
    int k = 0;//k
    double L = exp(-probaility);//e-i次方,
    while(p>=L){
        k++;
        double num = rand()%10000;
        p*=num/10000;//不断更新pi(p=p1*p2*p3...)
    }
    return k;
}

 

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值