C语言中可以通过rand函数
生成满足均匀分布
的随机数,但是生成满足正太分布的随机数就没有那么简单了,下面介绍一种常用的产生随机生成正态分布数据
的算法,并提供C语言
代码。
Box-Muller方法
:
基本思想:
先得到服从均匀分布的随机数; 然后再将服从均匀分布的随机数转变为服从正态分布.Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。
Box-Muller方法是以两组独立的随机数U和V,这两组数在(0,1]上均匀分布,用U和V生成两组独立的标准正太分布随机变量X和Y:
X = − 2 ln U cos ( 2 π V ) X = \sqrt{-2\ln U} \cos{(2\pi V)} X=−2lnUcos(2πV), Y = − 2 ln U sin ( 2 π V ) Y = \sqrt{-2\ln U} \sin{(2\pi V)} Y=−2lnUsin(2πV)
C语言实现:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
float gaussrand_NORMAL() {
static float V1, V2, S;
static int phase = 0;
float X;
if (phase == 0) {
do {
float U1 = (float) rand() / RAND_MAX;
float U2 = (float) rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;
} while (S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);
} else
X = V2 * sqrt(-2 * log(S) / S);
phase = 1 - phase;
return X;
}
float gaussrand(float mean, float stdc) {
return mean + gaussrand_NORMAL() * stdc;
}
int main()
{
float mean = 0;
float stdc = 1;
float data = 0;
for(int i=0; i<100; ++i){
data = gaussrand(0, 1);
printf("%f\t", data);
}
}
运行结果: