帮同学作的题目----伪随机数检验

来源:互联网 发布:小班美工活动花蝴蝶 编辑:程序博客网 时间:2024/05/11 22:38

1. 伪随机数检验
(1) 对高级语言自带的[0,1]均匀分布伪随机数发生器,进行平均值、方差、均匀性和相关性检验。(N=1000, 5000, 10000; rk=10,50,100)
(2) 对循环数列: 0, 0.01, 0.02, …, 0.99, 1.00, 0, 0.01, …. 进行上述检验。

解答:

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

/*
/*********************平均数******************
float pj(float *x,int num)
{ float sum=0;
 for(int i=0;i<num;i++)
 {sum+=x[i];}
 cout<<"平均数为:"<<sum/num<<endl;
 return sum/num;
}


/*********************均方差******************
float fc(float *x,int num,float ave)
{  float xx=0;
 for(int i=0;i<num;i++)
 {xx+=(x[i]-ave)*(x[i]-ave);}
    cout<<"均方差为:"<<xx/num<<endl;
 return 0;
}


/*********************均匀性******************
float jyx(float *x,float num,float div)//最多把区间分5份,均匀性采用X2检验法
{
 float x2=0,suu=0,y;
 y=1/div;
 float *count=new float [div];
 for(int j=0;j<div;j++)
 {count[j]=0;}
 for(int i=0;i<num;i++)
 {
   if(x[i]<=y) count[0]+=1;
      else if(x[i]>y&&x[i]<=y*2) count[1]+=1;
      else if(x[i]>2*y&&x[i]<=3*y) count[2]+=1;
   else if(x[i]>3*y&&x[i]<=4*y) count[3]+=1;
   else if(x[i]>4*y&&x[i]<=5*y) count[4]+=1;
 }
 
 for(j=0;j<div;j++)
 {cout<<count[j]<<endl;
  suu+=(count[j]-num/div)*(count[j]-num/div);
    }
  x2=suu*div/num;
  cout<<"X2的值为:"<<x2<<endl;//得出X2后去查分布表,比较X2和Ta 如:X2<Ta,则在
                               //a的显著水平下,原伪随机数在[0,1]区间是均匀分布的
                               //X2分布表用一个二维数组即可,数太多我就不具体实现拉
 delete [] count;
 return 0;
}

/**********************计算相关性函数,r是函数指针,length是间距,N是抽样数*****************
double xgx(int (*r)(),int length,long N)
{ long n;
  double rdm,average,power_aver,link_aver,corr,*p; 
 
  p=(double *)malloc(length*sizeof(double));    
  average=power_aver=link_aver=0;
  for(n=0;n<length;n++)p[n]=(*r)();
  for(n=0;n<N;n++)
     {rdm=(*r)();
      average+=rdm;
      power_aver+=rdm*rdm;
      link_aver+=p[n%length]*rdm;
      p[n%length]=rdm;
     }
  average/=N;
  power_aver/=N;
  link_aver/=N;
  corr=(link_aver-average*average)/(power_aver-average*average);
  return(corr);
}

main()
{   //第一问
 int i;
    float av,x=0.01,data[5000],ss[100];
 double d;
    srand( (unsigned)time( NULL ) );//时间作为种子
 
 for(i=0;i<=4999;i++)
   {
 data[i]=rand()%100;
    data[i]=data[i]/100;
 cout<<i   <<"   " <<data[i]<<endl;
 
   }
   cout<<"*********第一问*********"<<endl; 
   av=pj(data,5000);
   fc(data,5000,av);
   jyx(data,5000,4);
   d=xgx(rand,3,10);//直接rand函数为参数传进去
   cout<<d<<endl;
   //第二问
cout<<"*********第二问*********"<<endl;
  ss[0]=0;
   for(i=1;i<=100;i++)
  {
  
   ss[i]=ss[i-1]+0.01;
  }
   av=pj(ss,100);
   fc(ss,100,av);
   jyx(ss,100,4);
   d=xgx(rand,3,10);//直接rand函数为参数传进去
   cout<<d<<endl;
}*/
main()
{
 
 char *p=NULL;
 p=(char*)malloc(100);
 strcpy(p,"b");
 printf("%c",*p);
 return 0;
}
 

原创粉丝点击