1. 程式人生 > >如何模擬高斯分佈的隨機數發生器?

如何模擬高斯分佈的隨機數發生器?

在一些演算法中,經常會用到隨機數,最常用的隨機數有兩種,一是服從均勻分佈的隨機數,二是服從高斯分佈(正態分佈)的隨機數。在標準C中並沒有產生高斯分佈的隨機數發生器,只有服從均勻分佈的隨機數發生器rand(),那麼如何通過rand()來模擬出高斯分佈特徵的偽隨機數呢?這就是本文的話題。

實驗原理:高斯分佈的隨機數在概率上服從高斯分佈,如果通過rand()產生某個區間的隨機數,通過高斯分佈的概率計算公式得到該隨機數對應的概率值,然後與一個隨機概率進行比較,如果該概率值大於隨機概率,就認為該隨機數是服從高斯分佈的隨機數。

高斯分佈隨機數的引數:隨機數的區間為[f_floor,f_ceil],mu為均值,sigma為std標準差

廢話少說,直接上程式碼,基於Matlab進行的模擬實驗:

%% 產生指定區間上服從正態分佈的隨機數
%% [f_floor,f_ceil],mu為均值,sigma為std標準差
%% 生成原理:用均勻rand生成該區間的x,然後計算對應的高斯概率,
%% 與隨機概率比較,如果大於隨機概率,則挑出來作為一個值
%% 
%digits(50)%設定數字精度
f_floor = -10.0;
f_ceil = 10.0;
mu = 5;
sigma = 1;
N = 100000;
X = zeros(1,100);
for n = 1:N
prob = 0;
y = rand();
while prob < y;
    x = f_floor + (f_ceil - f_floor) * rand();
    prob = 1/sqrt(2*pi*sigma*sigma)*exp(-(x-mu)^2/sigma/sigma/2);
    y = rand();
end;
X(n) = x;
end;
plot(X);
hist(X,50)
實驗結果如圖所示:


實驗結果分析:

通過統計直方圖可以看出,通過這種機制生成的隨機數大致滿足區間為[f_floor,f_ceil],mu為均值,sigma為std標準差的高斯分佈隨機數。也就證明了演算法的正確性。

高斯分佈的隨機數或者高斯噪聲在現代數字訊號處理中常常用到,而在一些開發平臺並沒有提供可以直接呼叫的高斯隨機數發生器,因此就需要模擬出高斯隨機數,而本文可以作為參照進行。

*************************************************************************************************************************************
2015-7-21