C语言生成符合柯西、指数分布(离散型)的随机数(手写)
程序员文章站
2022-04-14 20:37:06
...
求满足连续性概率分布的随机数生成
(C语言生成符合泊松分布(离散型)的随机数(手写))https://blog.csdn.net/Zhang_713/article/details/109130118
对于连续型概率分布,只需要通过反函数即可得出随机数。原理如下:
下图为利用反函数求随机数并根据随机数的频率得到分布图的过程。
而下面这个图的原函数是x3次方,反函数为x1/3次方,我们用rand生成一些随机数并代入x1/3次方得到的值yi就是图上的蓝线,根据在y轴上设置好的区间来看,0-10的y数量相对比80-100的y数量明显少了太多,而0-10的y的数量就映射到le图中x轴绿色位置的对应的红线上的点,这些点就满足x3分布。类似的连续性概率分布原理都是如此。
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;
}
上一篇: Java的五个条件语句练习题