Matlab 产⽣随机数函数rand 和randn 的“state”和“seed”参数众所周知,Matlab 中的rand()函数产⽣的是伪随机数,但⼀般⽤来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产⽣的伪随机数是唯⼀确定的。问题来了,Matlab 每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产⽣的随机数会出现两次随机数⼀模⼀样的情况,如:
可以看到,第三次产⽣随机数,因为初始状态都是0,所以产⽣了完全⼀样的随机数!
设定初始状态的好处是,只需要保存那时的初始状态再运⾏⼀遍程序你就可以重现之前的计算过程和结果。
缺点是虽然程序使⽤了随机数,但由于(每次启动后)初始状态⼀样,实际运⾏出来却是相同的重复过程,你需要⼈⼯设定⼀个保证随机性的初始状态。
Part A: 如何设置初始状态?
设置随机数初始状态有三种语法形式,如下
rand('state', S)rand('twister', S)
S 是表⽰初始状态的整数。
seed 、state 、twister 就⽐较奇怪,令⼈捉摸不透,不知道该选⽤哪个。这实际上是产⽣随机数的不同。seed 表⽰采⽤v4版本的随机数产⽣器,state 是v5版本的随机数产⽣器,最后的twister ⽤的则是Mersenne Twister 随机数产⽣器。“  Generator = 'seed' referred to the MATLAB  v4 generator, not to the seed initialization value.            Generator = 'state' referred to the MATLAB v5 generators, not to the internal state of the generator.            Generator = 'twister' referred to the Mersenne Twister  generator, now the MATLAB startup generator.        ”
那么具体该⽤哪⼀个呢?在新版本的语法说明中,Matlab 给出了答案:前两个随机数产⽣器都是“flawed”,推荐⼤家使⽤twister 随机数产⽣器。
此外,MathWorks 公司意识到了这⼏个参数可能会产⽣误导,于是在新版本(2012及以后)的Matlab 中更新了语法。[plain]
01. >> rand('state',0)  02. >> rand(3,1)  03.  04. ans =  05.  06.    0.9501  07.    0.2311  08.    0.6068  09.  10. >> rand(3,1)  11.  12. ans =  13.  14.    0.4860  15.    0.8913  16.    0.7621  17.  18. >> rand('state',0)  19. >> rand(3,1)  20.  21. ans =  22.  23.    0.9501  24.    0.2311  25.    0.6068matlab生成随机数
[html]
01. <pre  name ="code" class ="html">rand('seed', S)
新版的Matlab 默认采⽤Mersenne Twister 随机数产⽣器,rng(S) 函数表⽰设定初始状态,rng('shuffle') 表⽰随机分配⼀个初始状态。所以现在只需要记住rng()函数设置初始状态,然后⽤rand 产⽣随机数就可以了。
然⽽,有时我们只需要“真正”的伪随机数(不重复!),如何得到?
Part B: 如何产⽣⾮重复的随机数
⽤2012版本之后的⽤户⽐较⽅便,在产⽣随机数之前使⽤rng('shuffle')洗⼀下就可以(shuffle 是洗牌的意思)。
对于旧版本的⽤户,还不⽀持rng 函数。以前⼀般是rand('state',sum(100*clock))来根据当前时间设定初始状态,但时间始终是递增的,⽽且变化幅度相对来说很⼩,效果不是很好。
有很多⼈⽤别的⽅式设定初始状态(如rand('twister', fix(mod(1e11*(sum(clock)-2009), 2^31)));),为简便起见,个⼈推荐采⽤新版Matlab 中rng 函数语法,即rand('twister',mod(floor(now*8640000),2^31-1)) ,这样可以产⽣的不同的随机数。采⽤这种办法⼤约每497天种⼦才会重复⼀次,⼀般使⽤的话⾜够了。
参考⽂献:
Generate Random Numbers That Are Different [html]
01. rng(1);  02. A  = rand (2,2);  03.  04. rng('shuffle')<pre  name ="code" class ="html">A  = rand (2,2);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。