自己編寫產生隨機數函式--MATLAB實現
阿新 • • 發佈:2018-12-29
這學期選了《現代數字訊號處理》這門課,全是訊號的東東,本科完全沒有接觸過這個東東,聽起來有點費勁,作業還是用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