产生随机数rand和randn中的“state”、“seed”和"twister"参数

产生随机数rand和randn中的“state”、“seed”和"twister"参数

 

 

众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:

 

 

 

  1. >> rand('state',0) 
  2. >> rand(3,1)
  3. ans =
  4.     0.9501
  5.     0.2311
  6.     0.6068
  7. >> rand(3,1)
  8. ans =
  9.     0.4860
  10.     0.8913
  11.     0.7621
  12. >> rand('state',0)
  13. >> rand(3,1)
  14. ans =
  15.     0.9501
  16.     0.2311
  17.     0.6068
复制代码



 

可以看到,第三次产生随机数,因为初始状态都是0,所以产生了完全一样的随机数!

设定初始状态的好处是,只需要保存那时的初始状态再运行一遍程序你就可以重现之前的计算过程和结果。

 

缺点是虽然程序使用了随机数,但由于(每次启动后)初始状态一样,实际运行出来却是相同的重复过程,你需要人工设定一个保证随机性的初始状态。

 

 

 

Part A: 如何设置初始状态?

 

设置随机数初始状态有三种语法形式,如下

 

  1. rand('seed', 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 theMersenne Twister generator, now the MATLAB startup generator.       ”


 

 

那么具体该用哪一个呢?在新版本的语法说明中,Matlab给出了答案:前两个随机数产生器都是“flawed”,推荐大家使用twister随机数产生器。

 

此外,MathWorks公司意识到了这几个参数可能会产生误导,于是在新版本(2012及以后)的Matlab中更新了语法。


  1. rng(1);
  2. A = rand(2,2)
复制代码



新版的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函数语法,即

 

  1. rand('twister',mod(floor(now*8640000),2^31-1));
复制代码


每次如此设置初始状态后即可产生不同的随机数。大约每497天种子才会重复一次,对于一般使用是足够了。

 

 




 

参考文献:

 

Generate Random Numbers That Are Different

 

http://cn.mathworks.com/help/matlab/math/generate-random-numbers-that-are-different.html

 

posted @ 2018-07-12 20:11  菜鸡一枚  阅读(1783)  评论(0编辑  收藏  举报