1. 程式人生 > >自己編寫產生隨機數函式--MATLAB實現

自己編寫產生隨機數函式--MATLAB實現

這學期選了《現代數字訊號處理》這門課,全是訊號的東東,本科完全沒有接觸過這個東東,聽起來有點費勁,作業還是用matlab做,第一個作業就用到了隨機數,本來matlab有自己帶的產生隨機數的函式,但是老師說要自己寫一個函式,好吧,還是自己寫一個吧:

各種上網找資料,首先找到了一個用匯編寫的,比較牛,連結貼出來:

http://www.luocong.com/articles/show_article.asp?Article_ID=24

Matlab產生均勻分佈的隨機數:

一般我們用計算機產生的隨機數都不是真正的隨機數,稱作偽隨機數,但是計算方法合理的話,產生的偽隨機數接近於真正的隨機數,滿足一般的需求。

均勻分佈的隨機數是其他隨機數的基礎,最長用的產生均勻分佈隨機數的方法是採用除留餘數法。

模型如下:

 y[n+1] = (y[n]*m+c) mod M;

這裡的mod表示取餘數,通俗的解釋,就是用前一個隨機數y[n]乘上一個權值w,加上一個增量c,對M取餘數。

c和M都是非負的。

Matlab程式碼:

Matlab 產生正態(高斯)分佈的隨機數:

原理沒太懂,直接寫程式碼:

%產生一個N(0,1)正態分佈隨機數
%採用篩選法,精度較高
%其他方法可參閱《現代應用數學手冊--概率統計與隨機過程卷》清華大學出版社馬振華主編
%function y=riddling()
function y=m_gauss()
sign=0;
while 1
    x=rand(1,2);%產生兩個[0,1]間均勻分佈的隨機數
    v1=2*x(1)-1;v2=2*x(2)-1;
    s=v1^2+v2^2;
    if s<=1
        a=sqrt(-2*log(s)/s);
        y=v1*a;
        sign=1;
    end
    if sign==1
        break;
    end
end

%產生n個N(a,b)正態分佈隨機數
%其中a為均值,b為方差
%function x=normal(a,b,n)
function x=normal(a,b,n)
m=48;%m應儘量大,m取12時近似程度已較好
for i=1:n
    r=rand(1,m);
    x(i)=a+sqrt(b)*(sum(r)-m/2)/sqrt(m/12);
end
參考:
http://bbs.sjtu.edu.cn/bbstcon,board,MathTools,reid,1071206851.html