计算机模拟产生几种随机数的算法实现

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

#define PI 3.14
#define MAX 32767
#define MIN 0

int integer_rand(int max,int min) //产生离散型随机整数的函数,输入值max、min分别代表产生整数的最大最小值
{
int i;
srand(time(NULL));
i=min+rand()%(max-min+1); //随机产生的数对(max-min+1)取模再加上min,使得产生的随机数落入min~max之间

return i; //返回值为产生随机数

}


double flo_rand(float max,float min) //产生均匀分布函数,产生的随机数介于max,min之间,小数点后取3位有效数字
{
int i;
double j;
i=integer_rand(1000,0);
j=i/1000.000;
return (min+j*(max-min));

}


int bin_dis(float miu) //模拟产生两点分布函数,miu为两点分布概率;
{
double k;
k=flo_rand(1.0,0.0);
if(k-miu>0) //随机数大于μ值则返回1,否则返回0;
return 1;
return 0;
}


int pois_dis(int lambda) //模拟产生泊松分布函数,参数lambda为泊松分布均值;
{ double rnd,p,pos;
int k=0;

rnd=flo_rand(1.0,0);
p=exp(-lambda);
pos=p;

while(1)
{
if(pos>rnd)
return k; //返回值为产生的泊松随机数
k++;
p*=lambda/k;
pos+=p;
}

}


double normal_dis(double miu,double sigma,float f) //正态分布产生函数,参数miu为均值,sigma为方差,f(取正数)为正态分布的取值区间;
{
double r1,r2;
float max,min;
max=f;
min=-f;
r1=flo_rand(max,min);
r2=flo_rand(max,min);

return sqrt(-2*log(r1))*cos(2*PI*r2)*sigma+miu ; //返回值为产生随机数

}


double exp_dis(double lambda) //指数分布产生函数,参数lambda为指数分布服从参数
{
double rnd,ret;
rnd=flo_rand(1.0,0);
ret = -log(1 - rnd) /lambda;


return ret;

}


double squ_dis(int n,float f) //卡方分布产生函数,参数n为卡方分布自由度,f为独立同分布的正态分布的取值区间
{ int i;
long double x;
for(i=0;i<n;i++)
{
x+=pow(normal_dis(0,1,f),2);

}
return x; //返回值为产生随机数

}





double F_dis(int n1,int n2,float f) //F分布产生函数,参数n1,n2分别为对应卡方分布的自由度,f为卡方对应的正太分布取值区间
{

int fn1=n1,fn2=n2;
float ff=f;
double x1,x2;
double ret;

x1=squ_dis(fn1,ff);
x2=squ_dis(fn2,ff);

ret=fn2*x1/(fn1*x2);

return ret; //返回值为产生的F分布随机数
}


double beta_dis(int a,int b) //beta分布产生函数,参数为a,b
{
double rnd[100];
double temp,ret;
int i,j;
for(i=0;i<a+b-1;i++)
{
rnd[i]=flo_rand(1.0,0);

}
for(i=0;i<a+b-1;i++)
{
for(j=i+1;j<a+b-1;j++)
if(rnd[i]>rnd[j])
{ temp=rnd[i];
rnd[i]=rnd[j];
rnd[j]=rnd[i];
}
}
ret=rnd[a];
return ret;

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值