1. 公式
概率密度函數:
均值:
方差:
2. C代碼生成隨機數
C代碼
double Gauss(double mean, double sigma, long int * seed)
{
static double V1, V2, S;
static int phase = 0;
double X,U1,U2;
if ( phase == 0 ) {
do {
U1 = Uniform(0.0, 1.0, seed);
U2 = Uniform(0.0, 1.0, seed);
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;
X = X * sigma + mean;
return X;
}
參數說明:
- mean:正態分佈的均值
μ - sigma:正態分佈的均方差
σ - *seed:隨機數的種子
生成1000個均值爲0,方差爲1的隨機數:
void main(void)
{
long int seed = 13579;
int j, num;
double mean, sigma, temp;
FILE * fp;
mean = 0;
sigma = 1;
num = 1000;
fp = fopen("gauss.dat", "w");
for (j = 0; j < num; j++)
{
temp = Gauss(a, b, &seed);
fprintf(fp, "%10.7f\n", temp);
}
fclose(fp);
}
3. 對比matlab的生成結果
用matlab生成相同數量的隨機數,對比概率密度估計:
num = 1000;
mean = 0;
sigma = 1;
% 繪製概率密度函數
x = -(sigma*3+1):0.01:(sigma*3+1);
y = normpdf(x,mean,sigma);
figure(1); plot(x,y);
% 繪製隨機數對比圖
z1 = VarName1;
z2 = normrnd(mean,sigma,1,num);
x1 = 0:1:(num-1);
figure(2); plot(x1, z1, 'r.', x1, z2, 'b.');
% 繪製概率密度估計對比圖
y1 = ksdensity(z1);
y2 = ksdensity(z2);
figure(3);
plot(y1,'DisplayName','gauss');
hold on;
plot(y2,'DisplayName','normrnd');
hold off;
概率密度函數圖:
隨機數對比圖:
概率密度估計對比圖: