使用中心极限定理(大数定理)将几个平均分布随机数加起来,从而产生正态分布或高斯分布随机数(有缺点)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NSUM 23
double GaussRand()
{
double x = 0;
int i;
for (size_t i = 0; i < NSUM; i++)
{
x += (double)rand() / RAND_MAX;
x -= NSUM / 2.0;
x /= sqrt(NSUM / 12.0);
return x;
}
}
int main()
{
printf("%lf", GaussRand());
return 0;
}
这种方法实现起来虽然简单,但还是比较差的,尤其是当NSUM数值很小的时候。也有其他实现方法,下次再说。