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=−2lnU cos(2πV), Y = − 2 ln U sin ( 2 π V ) Y = \sqrt{-2\ln U} \sin{(2\pi V)} Y=−2lnU sin(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); } }运行结果: