在通信或者其他仿真的时候
源代码在线查看: n(0,1).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 {
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 {
m=SPACING/DIV*j-0.2;
n=SPACING/DIV*(j+1)-0.2;
if(normal>=m && normal 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 printf("z[%d]=%d\n",j,z[j]); //统计落入各个区间的随机变量的个数
for(j=0;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);
}