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

📄 random06041033.cpp

📁 产生服从正态、瑞利、泊松分布的随机数。分别为N(0,1),N(0,3.6),Rayleigh(0,1),R(0,3.6),P(0,1),P(0,3.6)
💻 CPP
字号:

#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
#define PI 3.1415926
#define N 10000

double Urand0_1()  // get a uniform random number within [0,1]
{ 
	return (double)rand()/RAND_MAX; 
}

//get a (standard)Gaussian/Nnormal distributed random number whit Marsaglia-Bray Polar Method (1965)
double Grand_1() 
{
	
	bool k=true;
	double u1,u2,v1,v2,w,x1,x2,y;
	while(k)
	{
		u1=Urand0_1();
		u2=Urand0_1();
		v1=2*u1-1;
		v2=2*u2-1;
		w=v1*v1+v2*v2;
		if(w<=1)
		{
			y=sqrt((-2*log(w))/w);
			x1=v1*y;
			x2=v2*y;
			k=false;
		}
	}
	return x1;
}

//get a (standard)Gaussian/Nnormal distributed random number whit Box-Muller Method(1958)
double Grand_2() 
{
	double u1,u2,x;
	u1=Urand0_1();
	u2=Urand0_1();
	x=sqrt(-2*log(u1))*cos(2*PI*u2);
	return x;
}

//get a (standard)Gaussian/Nnormal distributed random number whit Sum-of-12 Method
double Grand_3() 
{
	double u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12,x;
	u1=Urand0_1();
	u2=Urand0_1();
	u3=Urand0_1();
	u4=Urand0_1();
	u5=Urand0_1();
	u6=Urand0_1();
	u7=Urand0_1();
	u8=Urand0_1();
	u9=Urand0_1();
	u10=Urand0_1();
	u11=Urand0_1();
	u12=Urand0_1();
	x=(u1+u2+u3+u4+u5+u6+u7+u8+u9+u10+u11+u12)-6.0;
	return x;
}

double Rayleigh(double miu,double sigma) //Generate Rayleigh(miu,sigma) random numbers
{
	double y1,y2,x1,x2,x;
	y1=Grand_1();
	y2=Grand_1();
	x1=miu+sigma*y1;
	x2=miu+sigma*y2;
	x=sqrt(x1*x1+x2*x2);
	return x;
}

int poisson(double lamda) //Generate piosson distributed random numbers whit λ=lamda
{
	bool k=true;
	double a=exp(-lamda),b=1.0,u;
	int i=0,x;
	while(k)
	{
		u=Urand0_1();
		b=b*u;		
		if(b<a)
		{
			x=i;
			k=false;
		}
		else
		{
			i++;
		}
	}
	return x;
}

void main()
{
	int i,y;
	int Unum[8],Gnum_1_1[8],Gnum_1_2[8],Gnum_1_3[8],Gnum_2[12],Gnum_3[8];
	int Rnum_1[8],Rnum_2[8];
	int Pnum_1[8],Pnum_2[8],Pnum_3[8],Pnum_4[8];
	double x;
	unsigned MySeed=(unsigned)time( NULL );//initialize the random number seed   
    srand((unsigned)MySeed);
	for(i=0;i<8;i++)
	{
		Unum[i]=0;
		Gnum_1_1[i]=0;
		Gnum_1_2[i]=0;
		Gnum_1_3[i]=0;		
		Gnum_3[i]=0;
		Rnum_1[i]=0;
		Rnum_2[i]=0;
		Pnum_1[i]=0;
		Pnum_2[i]=0;
		Pnum_3[i]=0;
		Pnum_4[i]=0;
	}
	for(i=0;i<12;i++)
	{
		Gnum_2[i]=0;
	}

	//account the uniform distributed numbers in different areas within [0,1]
	for(i=0;i<N;i++)
	{
		x=Urand0_1();
		if(x<0.2)Unum[0]++;
		if(x>=0.2&&x<0.4)Unum[1]++;
		if(x>=0.4&&x<0.6)Unum[2]++;
		if(x>=0.6&&x<0.8)Unum[3]++;
		if(x>=0.8&&x<1.0)Unum[4]++;
	}
	//print the amount of the uniform distributed numbers in different areas
	printf("Uniform Distribution X~U[0,1]\n");
	for(i=0;i<5;i++)
		printf("[%2f,%2f]: %-8d\n",(i/5.0),(i+1)/5.0,Unum[i]);
	printf("\n\n");
	
	//account the Gaussian distributed numbers which x~N[0,1](Marsaglia-Bray Polar Method) in different areas within [-4.0,4.0]
	for(i=0;i<N;i++)
	{
		x=Grand_1();
		if(x>=-4.0&&x<-3.0)Gnum_1_1[0]++;
		if(x>=-3.0&&x<-2.0)Gnum_1_1[1]++;
		if(x>=-2.0&&x<-1.0)Gnum_1_1[2]++;
		if(x>=-1.0&&x<0.0)Gnum_1_1[3]++;
		if(x>=0.0&&x<1.0)Gnum_1_1[4]++;
		if(x>=1.0&&x<2.0)Gnum_1_1[5]++;
		if(x>=2.0&&x<3.0)Gnum_1_1[6]++;
		if(x>=3.0&&x<4.0)Gnum_1_1[7]++;
	}
	//print the amount of the Gaussian distributed numbers which x~N[0,1]
	printf("Gaussian Distribution X~N[0,1] (Marsaglia-Bray Polar Method)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",(i-4),(i-4+1),Gnum_1_1[i]);
	printf("\n\n");

	//account the Gaussian distributed numbers which x~N[0,1](Box-Muller Method) in different areas within [-4.0,4.0]
	for(i=0;i<N;i++)
	{
		x=Grand_2();
		if(x>=-4.0&&x<-3.0)Gnum_1_2[0]++;
		if(x>=-3.0&&x<-2.0)Gnum_1_2[1]++;
		if(x>=-2.0&&x<-1.0)Gnum_1_2[2]++;
		if(x>=-1.0&&x<0.0)Gnum_1_2[3]++;
		if(x>=0.0&&x<1.0)Gnum_1_2[4]++;
		if(x>=1.0&&x<2.0)Gnum_1_2[5]++;
		if(x>=2.0&&x<3.0)Gnum_1_2[6]++;
		if(x>=3.0&&x<4.0)Gnum_1_2[7]++;
	}
	//print the amount of the Gaussian distributed numbers which x~N[0,1]
	printf("Gaussian Distribution X~N[0,1] (Box-Muller Method)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",(i-4),(i-4+1),Gnum_1_2[i]);
	printf("\n\n");

	//account the Gaussian distributed numbers which x~N[0,1](Sum-of-12 Method) in different areas within [-4.0,4.0]
	for(i=0;i<N;i++)
	{
		x=Grand_3();
		if(x>=-4.0&&x<-3.0)Gnum_1_3[0]++;
		if(x>=-3.0&&x<-2.0)Gnum_1_3[1]++;
		if(x>=-2.0&&x<-1.0)Gnum_1_3[2]++;
		if(x>=-1.0&&x<0.0)Gnum_1_3[3]++;
		if(x>=0.0&&x<1.0)Gnum_1_3[4]++;
		if(x>=1.0&&x<2.0)Gnum_1_3[5]++;
		if(x>=2.0&&x<3.0)Gnum_1_3[6]++;
		if(x>=3.0&&x<4.0)Gnum_1_3[7]++;
	}
	//print the amount of the Gaussian distributed numbers which x~N[0,1]
	printf("Gaussian Distribution X~N[0,1] (Sum-of-12 Method)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",(i-4),(i-4+1),Gnum_1_3[i]);
	printf("\n\n");
	
	//account the Gaussian distributed numbers which x~N[0,3.6] in different areas within [-4.0,4.0]
	for(i=0;i<N;i++)
	{
		x=3.6*Grand_1();
		if(x>=-12.0&&x<-10.0)Gnum_2[0]++;
		if(x>=-10.0&&x<-8.0)Gnum_2[1]++;
		if(x>=-8.0&&x<-6.0)Gnum_2[2]++;
		if(x>=-6.0&&x<-4.0)Gnum_2[3]++;
		if(x>=-4.0&&x<-2.0)Gnum_2[4]++;
		if(x>=-2.0&&x<0.0)Gnum_2[5]++;
		if(x>=0.0&&x<2.0)Gnum_2[6]++;
		if(x>=2.0&&x<4.0)Gnum_2[7]++;
		if(x>=4.0&&x<6.0)Gnum_2[8]++;
		if(x>=6.0&&x<8.0)Gnum_2[9]++;
		if(x>=8.0&&x<10.0)Gnum_2[10]++;
		if(x>=10.0&&x<12.0)Gnum_2[11]++;
	}
	//print the amount of the Gaussian distributed numbers which x~N[0,3.6]
	printf("Gaussian Distribution X~N[0,3.6]\n");
	for(i=0;i<12;i++)
		printf("[%2d,%2d]: %-8d\n",2*(i-6),2*(i-6+1),Gnum_2[i]);
	printf("\n\n");
	
	//account the Gaussian distributed numbers which x~N[-2,1] in different areas within [-6.0,2.0]
	for(i=0;i<N;i++)
	{
		x=-2+Grand_1();
		if(x>=-6.0&&x<-5.0)Gnum_3[0]++;
		if(x>=-5.0&&x<-4.0)Gnum_3[1]++;
		if(x>=-4.0&&x<-3.0)Gnum_3[2]++;
		if(x>=-3.0&&x<-2.0)Gnum_3[3]++;
		if(x>=-2.0&&x<-1.0)Gnum_3[4]++;
		if(x>=-1.0&&x<0.0)Gnum_3[5]++;
		if(x>=0.0&&x<1.0)Gnum_3[6]++;
		if(x>=1.0&&x<2.0)Gnum_3[7]++;
	}
	//print the amount of the Gaussian distributed numbers which x~N[-2,1]
	printf("Gaussian Distribution X~N[-2,1]\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",(i-6),(i-6+1),Gnum_3[i]);
	printf("\n\n");

	//account the Rayleigh distributed numbers which x~Rayleigh[0,1] in different areas within [0,4.0]
	for(i=0;i<N;i++)
	{
		x=Rayleigh(0.0,1.0);		
		if(x>=0.0&&x<0.5)Rnum_1[0]++;
		if(x>=0.5&&x<1.0)Rnum_1[1]++;
		if(x>=1.0&&x<1.5)Rnum_1[2]++;
		if(x>=1.5&&x<2.0)Rnum_1[3]++;
		if(x>=2.0&&x<2.5)Rnum_1[4]++;
		if(x>=2.5&&x<3.0)Rnum_1[5]++;
		if(x>=3.0&&x<3.5)Rnum_1[6]++;
		if(x>=3.5&&x<4.0)Rnum_1[7]++;
	}
	//print the amount of the Rayleigh distributed numbers which x~Rayleigh[0,1]
	printf("Rayleigh Distribution X~R[0,1]\n");
	for(i=0;i<8;i++)
		printf("[%f,%f]; %-8d\n",i/2.0,(i+1)/2.0,Rnum_1[i]);
	printf("\n\n");

	//account the Rayleigh distributed numbers which x~Rayleigh[0,3.6] in different areas within [0,8.0]
	for(i=0;i<N;i++)
	{
		x=Rayleigh(0.0,3.6);		
		if(x>=0.0&&x<1.0)Rnum_2[0]++;
		if(x>=1.0&&x<2.0)Rnum_2[1]++;
		if(x>=2.0&&x<3.0)Rnum_2[2]++;
		if(x>=3.0&&x<4.0)Rnum_2[3]++;
		if(x>=4.0&&x<5.0)Rnum_2[4]++;
		if(x>=5.0&&x<6.0)Rnum_2[5]++;
		if(x>=6.0&&x<7.0)Rnum_2[6]++;
		if(x>=7.0&&x<8.0)Rnum_2[7]++;
	}
	//print the amount of the Rayleigh distributed numbers which x~Rayleigh[0,3.6]
	printf("Rayleigh Distribution X~R[0,3.6]\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",i,i+1,Rnum_2[i]);
	printf("\n\n");

	//account the Poisson distributed numbers which y~Poisson(0.2) in different areas within [0,8]
	for(i=0;i<N;i++)
	{
		y=poisson(0.2);		
		if(y>=0&&y<1)Pnum_1[0]++;
		if(y>=1&&y<2)Pnum_1[1]++;
		if(y>=2&&y<3)Pnum_1[2]++;
		if(y>=3&&y<4)Pnum_1[3]++;
		if(y>=4&&y<5)Pnum_1[4]++;
		if(y>=5&&y<6)Pnum_1[5]++;
		if(y>=6&&y<7)Pnum_1[6]++;
		if(y>=7&&y<8)Pnum_1[7]++;
	}
	//print the amount of the Poisson distributed numbers which y~Poisson(0.2)
	printf("Poisson Distribution Y~P(0.2)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",i,i+1,Pnum_1[i]);
	printf("\n\n");

	//account the Poisson distributed numbers which y~Poisson(1.0) in different areas within [0,8]
	for(i=0;i<N;i++)
	{
		y=poisson(1.0);
		if(y>=0&&y<1)Pnum_2[0]++;
		if(y>=1&&y<2)Pnum_2[1]++;
		if(y>=2&&y<3)Pnum_2[2]++;
		if(y>=3&&y<4)Pnum_2[3]++;
		if(y>=4&&y<5)Pnum_2[4]++;
		if(y>=5&&y<6)Pnum_2[5]++;
		if(y>=6&&y<7)Pnum_2[6]++;
		if(y>=7&&y<8)Pnum_2[7]++;
	}
	//print the amount of the Rayleigh distributed numbers which y~poisson(1.0)
	printf("Poisson Distribution Y~P(1)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",i,i+1,Pnum_2[i]);
	printf("\n\n");

	//account the Poisson distributed numbers which y~Poisson(6.0) in different areas within [0,16]
	for(i=0;i<N;i++)
	{
		y=poisson(6.0);
		if(y>=0&&y<2)Pnum_3[0]++;
		if(y>=2&&y<4)Pnum_3[1]++;
		if(y>=4&&y<6)Pnum_3[2]++;
		if(y>=6&&y<8)Pnum_3[3]++;
		if(y>=8&&y<10)Pnum_3[4]++;
		if(y>=10&&y<12)Pnum_3[5]++;
		if(y>=12&&y<14)Pnum_3[6]++;
		if(y>=14&&y<16)Pnum_3[7]++;
	}
	//print the amount of the Rayleigh distributed numbers which y~poisson(6.0)
	printf("Poisson Distribution Y~P(6)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",2*i,2*(i+1),Pnum_3[i]);
	printf("\n\n");

	//account the Poisson distributed numbers which y~Poisson(10.0) in different areas within [0,16]
	for(i=0;i<N;i++)
	{
		y=poisson(10.0);
		if(y>=0&&y<2)Pnum_4[0]++;
		if(y>=2&&y<4)Pnum_4[1]++;
		if(y>=4&&y<6)Pnum_4[2]++;
		if(y>=6&&y<8)Pnum_4[3]++;
		if(y>=8&&y<10)Pnum_4[4]++;
		if(y>=10&&y<12)Pnum_4[5]++;
		if(y>=12&&y<14)Pnum_4[6]++;
		if(y>=14&&y<16)Pnum_4[7]++;
	}
	//print the amount of the Rayleigh distributed numbers which y~poisson(10.0)
	printf("Poisson Distribution Y~P(10)\n");
	for(i=0;i<8;i++)
		printf("[%2d,%2d]: %-8d\n",2*i,2*(i+1),Pnum_4[i]);
	printf("\n\n");

	getchar();

}

⌨️ 快捷键说明

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