这学期选了《现代数字信号处理》这门课,全是信号的东东,本科完全没有接触过这个东东,听起来有点费劲,作业还是用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