C語言與數字信號處理——正態分佈的隨機數

1. 公式

概率密度函數:

f(x)=1σ2πe(xμ)22σ2

均值:
E[X]=μ

方差:

VAR[X]=σ2

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;

概率密度函數圖:
這裏寫圖片描述

隨機數對比圖:
這裏寫圖片描述

概率密度估計對比圖:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章