MATLAB——rand 与 randn 'twister'、'state'、'seed'

来源:互联网 发布:大数据就业 知乎 编辑:程序博客网 时间:2024/05/28 04:56

 

rand与 randn  'twister'、'state'、'seed'  

 

MATLAB中有两个经常会用到的(伪)随机数发生函数:rand与randn。

rand函数——生成均匀分布伪随机数。

randn函数——生成正态分布伪随机数。


统计工具箱(StatisticalToolbox)中较为复杂的随机数发生函数都是通过调用rand函数和randn函数来实现的。

例如:均匀分布函数unifrnd要调用rand,正态分布函数normrand要调用randn,等等。 


每次启动MATLAB时rand与randn的初始状态都会被自动重置,从而产生完全相同的伪随机序列。即:启动MATLAB时,输入命令rand,得到0.8147,接着输入randn,得到1.8339(R2011b)。重启MATLAB后再次运行rand和randn,会得到完全一样的结果。如果想得到不同的伪随机序列,可以重置随机数发生函数的状态,相应语句为 rand(method,s)和randn(method,s)。


-----------------参数的说明----------------


参数method是一个字符串,指明伪随机数的生成算法,rand函数中method有三种选择:‘twister’、 ‘state’、 ‘seed’。

其中最新的‘twister’方法产生的伪随机序列重复周期最长,是MATALB 7.4 以上版本的默认方法。randn函数中只包括‘state’和‘seed’,默认方法是‘state’。

 

参数s设置所选方法的状态,可以用rand(method)和randn(method)查看method方法当前的状态(该命令并不改变随机数发生函数当前使用的算法):

‘seed’方法的状态是一个数,而‘state’与‘twister’方法的状态是一个数组。

用来设置状态的参数s是一个自然数,它将随机数发生器所选定的状态设置为‘第s个’可能的状态。

需要特别注意的是,无论使用何种方法,s的取值最好限制在0到2^31-1之间。

超出这个范围时,不同的s可能对应同一个状态。

可以证明,所有不小于2^32-1的s所对应的状态都与s=2^31-1所对应的状态相同。

s取2^31到2^32-2之间的不同值时对应的状态可能不同,但这些状态都已在s取0到2^31-1时出现过。



-------------得到不同伪随机序列的方法-------


rand的帮助文档中给出了一个示例方案rand('twister',sum(100*clock)),可以使每次运行得到的伪随机序列都不一样(rand‘'state',sum(100*clock)类似)。

该类方法将状态值设置为时变的。clock函数返回当前是时间的1*6数组(年,月,日,时,分,秒)。

sum(100*clock)一般不是整数,虽然貌似不太合乎规范,但运行起来没有问题,但该方法效率并不高。

主要原因是总状态数为2^31,约等于2.15e9;而sum(100*clock)的上届仅约为2.1e5,而且并非小于这个上界的每个值都取到。

http://newsgroups.derkeiler.com/Archive/Comp/comp.soft-sys.matlab/2006-02/msg04828.html对这个问题进行了详细分析,并且给出了一个效率较高的方法rand('twister',fix(mod(1e11*(sum(clock))-2009),2^31))。 

 除了rand和randn这两个基本函数之外,MATLAB统计工具箱还提供一个函数randg,用来产生归一化的服从Gamma分布的随机数。

Gamma分布随机数生成函数gamrnd和泊松分布随机数产生函数poissrnd需要调用randg来实现功能。

通过randg的帮助文档,可以发现randg这个随机数发生器的状态是由rand和randn二者的状态共同决定的。 

 

转:http://www.ilovematlab.cn/thread-164109-2-1.html

 


1 0
原创粉丝点击