欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言生成符合柯西、指数分布(离散型)的随机数(手写)

程序员文章站 2022-04-14 20:37:06
...

求满足连续性概率分布的随机数生成

(C语言生成符合泊松分布(离散型)的随机数(手写))https://blog.csdn.net/Zhang_713/article/details/109130118

对于连续型概率分布,只需要通过反函数即可得出随机数。原理如下:

下图为利用反函数求随机数并根据随机数的频率得到分布图的过程。

C语言生成符合柯西、指数分布(离散型)的随机数(手写)

  而下面这个图的原函数是x3次方,反函数为x1/3次方,我们用rand生成一些随机数并代入x1/3次方得到的值yi就是图上的蓝线,根据在y轴上设置好的区间来看,0-10的y数量相对比80-100的y数量明显少了太多,而0-10的y的数量就映射到le图中x轴绿色位置的对应的红线上的点,这些点就满足x3分布。类似的连续性概率分布原理都是如此。

C语言生成符合柯西、指数分布(离散型)的随机数(手写)

c语言代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

int main()
{
    double a;
    srand((unsigned)time(NULL));

    double z;
    double zhishu(double a1);//指数
    double Cauchy_03(double a1);//柯西
    double Zipf_28(double a1);//zf

    int aa[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//存区间频率
    for(int i=0;i<100000;i++){
        a = rand()%100000;
        if(a/10!=0){
            //z=-1/log(1-a/10);
            z=Cauchy_03(a/100000);
            if(z!=0){
                if(z<=1){aa[0]++;}//中间的1-8我是用作测试的,这里就删掉了
                else if(z<2){aa[9]++;}
                else if(z<3){aa[10]++;}
                else if(z<4){aa[11]++;}
                else if(z<5){aa[12]++;}
                else if(z<6){aa[13]++;}
                else if(z<7){aa[14]++;}
                else if(z<8){aa[15]++;}
                else if(z<9){aa[16]++;}

                else {aa[17]++;}


        }

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

    return 0;
}

double zhishu(double a1){
    double z;
    z=-1/log(1-a1);
    return z;
}


double Cauchy_03(double a1){
    double z,z1;
    z1=1/(3.14159*a1)-1;
    return z1;
}

double Zipf_28(double a1){

    return 0.1/a1;

}

 

相关标签: 概率论