⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mimi.cpp

📁 随即数的产生 在计算机仿真系统中的应用
💻 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 + -