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