自己编写产生随机数函数--MATLAB实现

来源:互联网 发布:手写alexnet网络结构 编辑:程序博客网 时间:2024/05/19 13:23

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

%产生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


                                             
0 0
原创粉丝点击