Matlab:RandStream函数

来源:互联网 发布:mac 更改启动项 编辑:程序博客网 时间:2024/06/10 22:01

  根据mathworks网站上的最新说明文档http://www.mathworks.cn/help/techdoc/ref/rand.html,手动设置随机数产生器状态的方法已经过时了。保留这一方式只是为了保证向下兼容。在v7.7以上的版本中,有如下的伪随机数产生器:Mersence twister, Multiplicative congruential generator, multiplicative lagged Fibonacci generator, Combined multiple recursive generator, Shift-register generator summed with linear congruential generator,Modified subtract with borrow generator。输入相关指令即可选择不同的发生器。默认情况,Matlab在启动时总是将各个发生器种子设置为0,这样包含随机函数的程序在每次运行的结果都是固定的。如果不想产生这种情况,可以将系统时间设置为种子s = RandStream('mt19937ar','seed',0);RandStream.setDefaultStream(s);这样每次matlab启动时候种子设置的不同会使得计算得到的随机序列不同。与7.7以前的版本不同,matlab推荐通过RandStream对象来实现随机序列的生成。

      要生成一个随机数,RandStream对象的使用方法如下:

      ①通过设定种子和生成算法来确定一个伪随机序列,RandStream的构造函数或RandStream.creat方法可用来完成此任务。

      ②使用RandStream.setDefaultStream函数将确定好的序列对象设置为当前Matlab使用的序列。

      ③通过rand等函数将上面的随机序列生成随机数。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      当然,也可不用将其设置为默认序列(省②),使用rand函数可以指定从哪个序列中生成随机数:

      stream = RandStream('mrg32k3a');

      rand(stream,1,5);

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

      使用RandStream.create函数可以创建独立同分布的随机序列,如

      [ s1,s2,s3] = randStream.create('mrg32k3a','');

      r1 = rand(s1,100000,1);

      r2 = rand(s2,100000,1);

      r3 = rand(s3,100000,1);

      corrcoef([r1 r2 r3]);

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       要使得前后两次生成的随机数保持一样,可以将递归计算过程中的伪随机数状态记录下来,然后下一次计算总是基于这个记录的伪随机数状态来进行,这样每次计算得到的随机数总是相同的。

       defaultStream = RandStream.getDefaultStream;

       savedState = defaultStream.State;

       v1 = rand(1,5)

      defaultStream.State = savedState;

       v2 = rand(1,5)

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       各个指令具体的使用方法可以通过helpdesk命令,搜索RandStream来查看。v7.7以上版本为了保持与旧版本兼容,保留了如rand('state',0)这种伪随机序列设置方法,称之为legacy mode.有关legacy mode的内容也可以在RandStream项中找到。

0 0