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值。

C语言生成符合泊松分布(离散型)的随机数(手写)_第1张图片

效果图

C语言生成符合泊松分布(离散型)的随机数(手写)_第2张图片

C语言生成符合泊松分布(离散型)的随机数(手写)_第3张图片

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

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

//c语言代码
#include
#include
#include
#include

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;
}

 

你可能感兴趣的:(概率论,概率论,c语言)