📄 mimi.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int SUB1();
double SUB2();
int nvalue; //区间个数K
double probd[25]; //存放各区间最小数的数组
long int a1,c1,m1,x1; //定义参数
void main(){
int i,m,ntypes,nx[20],number,number1;
float mn; //mn就是N/K
long int z0,a0,c0,m0,x0;
double x,xx1,y,yy1,yy2,ro1,ro2, xka2,squ;
printf("\n Following is to test the uniform."); //均匀性检验
printf("\n Input the number of area:");
scanf("%d",&ntypes); //输入区间个数K
printf("\n Input the number of random varible:");
scanf("%d",&number); //输入随机数个数n
printf("\n a,c,m is the parament of the random generator;");
printf("\n z0 is the seed of this random generator.");
printf("\n Input a,c,m,z0=");
scanf("%ld,%ld,%ld,%ld",&a1,&c1,&m1,&x1); //输入参数
a0=a1,c0=c1,m0=m1,x0=x1,z0=x1;
x=1.0/ntypes;
probd[1]=x;
for(i=2;i<=ntypes;i++) probd[i]=x+probd[i-1]; //求出每个区间的最小值
for(i=1;i<=ntypes;i++) nx[i]=0; //置每个区间上的随机数个数为0
nvalue=ntypes;
for(i=1;i<=number;i++){ //计算每个区间上的随机数的总数
m=SUB1(); //m为第几个区间
nx[m]=nx[m]+1;
}
mn=(float)number/(float)ntypes; //N/K
xka2=0.0; //x2 =0
for(i=1;i<=ntypes;i++){
squ=nx[i]-mn; //squ= nj-N/K
xka2+=squ*squ/mn; //计算x2
}
printf("\n a=%f,c=%f,m=%d,z0=%f,"); //打印均匀性检验的最后结果
printf("\n The number of random=%d",a1,c1,m1,z0,number);
for(i=1;i<=ntypes;i++)
printf("\n Number(%d)=%d",i,nx[i]);
printf("\n CHI-SQUARE=%f",xka2);
printf("\n Following is to test the independence!"); //独立性检验
printf("\n Input the number of random variable!");
scanf("%d", &number1); //输入随机数个数N
a1=a0;
c1=c0;
m1=m0;
x1=x0;
z0=x1;
x=SUB2(); //x为一个随机数
yy1=0.0;
yy2=x;
xx1=(x-0.5)*(x-0.5); //xx1=(Ui-1/2)*(Ui-1/2)
for(i=2;i<=number1;i++){
y=SUB2();
xx1+=(y-0.5)*(y-0.5);
yy1+=x*y; //计算Ui*Ui+j的总和
yy2+=y; //计算Ui+j的总和
x=y;
}
yy1/=(number1-1.0);
yy2/=number1;
yy2*=yy2;
xx1/=(number-1.0); //计算S2
ro1=(yy1-yy2)/xx1; //计算ρ1
ro2=fabs(ro1)*sqrt(number-1.0); //计算统计量μ
printf("\n Ro=%f,u=%f",ro1,ro2); // 打印独立性检验的结果
printf("\n----------Simulation Results----------");
printf("\n \n a=%f,c=%f,m=%d,z0=%f",a1,c1,m1,z0);
printf("\n----------The Uniform----------");
for(i=1;i<=ntypes;i++)
printf("\n Number(%d)=%d",i,nx[i]);
printf("\n Total_number=%d,CHI_SQYARE=%f",number,xka2);
printf("\n----------The Independence----------");
printf("\n Number of sample=%d RO=%f u=%f",number1,ro1,ro2);
}
int SUB1(){ //求出此随机数在哪个区间
double u;
int i;
u=SUB2(); //u为随机数
for(i=1;i<nvalue;i++)
if(u<probd[i]) return(i); //返回区间值
return(nvalue);
}
double SUB2(){ //随机数发生器
x1=(a1*x1+c1)%m1;
return((double)x1/(double)m1); //返回随机数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -