资源描述
正态随机数产生
一:原理
这个算法的主要理论依据是中心极限定理。由这个定理可知若有大量统计独立的随机变量的和,即:
式中,每个随机变量对总的变量Y足够小时,则在一定条件下,当时,随机变量Y服从正态分布,其和每个随机变量的分布律无关。在这里,我们产生了很多随机变量,这些随机变量都是由rand ()函数产生的随机数除以RAND_MAX产生的结果,当这些随机变量足够多时,近似认为随机变量Y服从正态分布。
因为是由系统产生的随机数,这些随机数满足0-1分布,方差D=1/12,均值E=1/2,。标准正态的E=0,=1,当随即数足够多时,其正态化的结果近似服从标准正态分布。
在C 语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统 。rand()会返回一随机数值,范围在0 至RAND_MAX 间。返回0 至RAND_MAX 之间的随机数值,RAND_MAX 定义在stdlib.h,(其值至少为32767)我运算的结果是一个不定的数 。
二:程序
理论证明多个[0,1]间的均匀分布之和标准化后能很好的近似一个标准正态随机变量. 部分程序段如下:
//rand()产生一个到RAND_MAX的均匀分布的随机变量.rand()/RAND_MAX即为[0,1]间的均匀分布随机变量.
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC;
HBRUSH hBrush;
HPEN hPen;
PAINTSTRUCT PtStr;
////////////////////////////
double gauss() ;
double x[5000],b[5000]={0};
int i,j;
int k;
srand((unsigned)time(NULL));
for(j=0;j<5000;j++)
{
x[j]=gauss() ;
}
double gauss()
{
double n=0; //使用前先初始随机函数种子:
for(int i=0;i<12;i++)
{
n+=(double)rand()/RAND_MAX;
}
n=(n-E)/sqrt((double)D); //标准化
return n;
}
三:程序的实现
我们的程序产生的一系列随机数,我们运用了API,将这些随机数以直方图的形式呈现出来,画图程序在源文件中。从图中已大致可以看出,这些数都是接近0的,且越接近0,数越多,这样就可以证明,中心极限定理的成立,即大量随机数在正态化后大致符合正态分布。
由API绘图后结果如下
4 / 4
展开阅读全文