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

📄 n(0,1).cpp

📁 在通信或者其他仿真的时候
💻 CPP
字号:
#define N 100000  //定义10万个随机变量
#define DIV 25    //定义25个区间
#define SPACING DIV*0.4    //定义区间总长
#include "math.h"
#include "stdio.h"
main()
{
	

	unsigned int M,C,x,i;
	int j;
	double y[N],mid[100],m,n,normal;
	static int z[100]={0,0};
	
	FILE *fp,*abscissa,*ordinate;
	fp=fopen("result.txt","a");
	abscissa=fopen("abscissa.txt","a");
	ordinate=fopen("ordinate.txt","a");
	normal=-6.0;
	M=(unsigned)pow(2,31)-1;   //给常量M赋值
	C=(unsigned)pow(7,5);     //给常量C赋值
	printf("Please input the initial value x(x>0, integer)");
	scanf("%d",&x);        //输入种子数x
    printf("M=%d\nC=%d\nx=%d\n\n",M,C,x);
	for(i=1;i<N;i++)
	{
		x=(C*x)%M;
		y[i]=((double)x)/M;     //产生(0,1)上均匀分布的随机变量y[i]
		normal=normal+y[i];     //用以产生正态分布
		if(i%12==0)
			{			
					for(j=-12;j<DIV-12;j++)
						{
							m=SPACING/DIV*j-0.2;
							n=SPACING/DIV*(j+1)-0.2;
								if(normal>=m && normal<=n)
									z[j+12]=z[j+12]+1;	
							mid[j+12]=(m+n)/2;     //取各个区间段的中值作为在MATLAB中画图的横坐标
							
						}
				fprintf(fp,"%35.4f\n",normal);    //将产生的正态分布数据存入文件result.txt中
				normal=-6.0;
			}
	}
	printf("\n\n\n");
	for(j=0;j<DIV;j++)
		printf("z[%d]=%d\n",j,z[j]);  //统计落入各个区间的随机变量的个数
	         
	for(j=0;j<DIV;j++)
		{
			printf("\n\n%f\t-->\t%f",mid[j],0.399*z[j]/z[12]);
			//我们共分了25个区间,程序执行以后,发现第12个区间落入的标准正态分布的随机变量个数最多。为了与标准正态分布的密度函数作比较,我们将z[12]等价为0.399,其余的z[i]数值也做等价转换。这里,0.399是标准正态分布的密度函数在x=0时的取值)
			fprintf(abscissa,"%f\n",mid[j]);   //将25个区间的中值存入文件abscissa.txt中,以便在MATLAB中画图时作为横坐标
			fprintf(ordinate,"%f\n",0.399*z[j]/z[12]); //产生ordinate.txt文件,以便在MATLAB中画图时作为纵坐标
		}
	printf("\n\n");
fclose(fp);
fclose(abscissa);
fclose(ordinate);

}

⌨️ 快捷键说明

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