Matlab产生随机数函数rand和randn的“state”和“seed”参数
来源:互联网 发布:关于网络爆红的论文 编辑:程序博客网 时间:2024/06/05 01:57
众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:
>> rand('state',0) >> rand(3,1)ans = 0.9501 0.2311 0.6068>> rand(3,1)ans = 0.4860 0.8913 0.7621>> rand('state',0)>> rand(3,1)ans = 0.9501 0.2311 0.6068
设定初始状态的好处是,只需要保存那时的初始状态再运行一遍程序你就可以重现之前的计算过程和结果。
缺点是虽然程序使用了随机数,但由于(每次启动后)初始状态一样,实际运行出来却是相同的重复过程,你需要人工设定一个保证随机性的初始状态。
Part A: 如何设置初始状态?
设置随机数初始状态有三种语法形式,如下
<pre name="code" class="html">rand('seed', S)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 theMersenne Twister generator, now the MATLAB startup generator. ”
那么具体该用哪一个呢?在新版本的语法说明中,Matlab给出了答案:前两个随机数产生器都是“flawed”,推荐大家使用twister随机数产生器。
此外,MathWorks公司意识到了这几个参数可能会产生误导,于是在新版本(2012及以后)的Matlab中更新了语法。
rng(1);A = rand(2,2);rng('shuffle')<pre name="code" class="html">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函数语法,即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
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- matlab中用rng替换rand('seed',sd)、randn('seed',sd)和rand('state',sd)的通俗解释
- randn命令中randn('state')和randn('seed')的不同
- randn命令中randn('state')和randn('seed')的不同
- MATLAB——rand 与 randn 'twister'、'state'、'seed'
- rand, randn和randint函数的区别(MATLAB)
- rand和randn函数
- MATLAB中rand()和randn()的用法
- matlab中 rand和 randn的区别
- matlab生成随机数的rand、randi和randn三种形式
- rand函数和srand函数:产生随机数
- rand函数和srand函数:产生随机数
- srand (seed) rand() 产生随机数
- Matlab的rand(),randn()和randi()函数问题
- 生成伪随机数的函数int rand(void)和void srand(unsigned seed);
- 产生随机数函数 rand和srand
- 算法——Reverse Integer
- 跟踪model中属性(值)的变更
- 数字化的企业会带来哪些变革
- 软件开发入门学习的个人看法。
- 轻量级 PHP 框架 TinyLara 更新:更优雅 附中文介绍
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- win7重装后使用easybcd引导linux
- 果断Mark!国外程序员收集整理的PHP资源大全
- 这是我的 Terminal
- Android HTTP请求中文乱码解决
- 就差一两个字母
- web.xml中<security-constraint>和四种认证类型
- dota 攻略
- SEO实战:站在用户角度做推广