随机数显著性检验.cpp

来自「1.书中所有的算法均用C语言描述」· C++ 代码 · 共 58 行

CPP
58
字号
#include <iostream>
#include <time.h>
#include<cmath>
using namespace std;

void rnds(double p[],int n)
{ //生成n个[0 1]间的均匀随机数。
	int i,m;
	unsigned long randSeed;
	randSeed=time(0);//取系统时间为当前种子
    double x0=randSeed+0.0;
    double  *r=&x0; 
	double s,u,v;
	s=65536.0; u=25741.0; v=13849.0;
	for (i=0; i<=n-1; i++)
	{	
		*r=u*(*r)+v;
		m=(int)(*r/s);
		*r=*r-m*s; 
		p[i]=*r/s;
	}
    return;
}
bool remarkable(int n,double p[],double a)
{
	
    double r=0,s=0;
	for(int i=0;i<n;i++)
		r+=p[i];
 	r=r/n;
//	cout<<r<<endl;
    for(i=0;i<n;i++)
		s+=(1/2-p[i])*(1/2-p[i]);
    s=s/n;
//	cout<<s<<endl;
	double u1=sqrt(12*n/10000)*(r-1/2);
	double u2=sqrt(45*n/10000)*(r*r-1/3)*1/2;
	double u3=sqrt(180*n/10000)*(s*s-1/12);
//	cout<<u1<<" "<<u2<<" "<<u3<<endl;
    if(fabs(u1)>=a||fabs(u2)>=a||fabs(u3)>=a)
	return false;
	return true;


}
void main()
{ 
	
	int n=10000;
	double p[100000];
    rnds(p,n);
    if(remarkable(n,p,1.65))
		cout<<"pass the test"<<endl;
	else
		cout<<"fail to pass the test"<<endl;


}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?