Matlab中rand('state',sum(clock))解析
一.问题来源
来自于一份PSO代码,PSO中需要初始化粒子位置和速度。
二.问题探究
众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:
>> rand('state',)
>> rand(,) ans = 0.9501
0.2311
0.6068 >> rand(,) ans = 0.4860
0.8913
0.7621 >> rand('state',)
>> rand(,) ans = 0.9501
0.2311
0.6068
可以看到,第三次产生随机数,因为初始状态都是0,所以产生了完全一样的随机数!
设定初始状态的好处是,只需要保存那时的初始状态再运行一遍程序你就可以重现之前的计算过程和结果。
缺点是虽然程序使用了随机数,但由于(每次启动后)初始状态一样,实际运行出来却是相同的重复过程,你需要人工设定一个保证随机性的初始状态。
三.问题分析
计算机系统中的随机数都是伪随机数,是通过一个算法连续产生的,知道上一个随机数,下一个随机数就确定,已知从给定的某个数开始,后面连续的随机数序列都已经确定,我们使用随机数就好像从这个序列中(也叫随机数流)中取数字使用,为了增加随机数的随机程度,和可控性,用rand('state',X)来设置随机数流的状态,就像C语言中随机数的seed,一旦给一个X值,那么后面的随机数流就确定,为了增加随机性,这里用当前时间数码sum(clock)作为随机数的状态,clock返回一个6个元素的向量分辨是年月日时分秒,sum加起来就作为随机数的状态,因为你每次运行程序的时间不同,所以得到的随机数序列就不同单独使用这句时,改变了随机数流的状态,但是还没有使用,所以不产生任何变量。但这个算法有一个问题是,如果计算机太快的话,仍然会生成相同随机数。可考虑用 rand('state',sum(clock)*rand(1))。
四.问题解决
4.1 如何设置初始状态
rand('seed', S)
rand('state', S)
rand('twister', S)
S是表示初始状态的整数。
seed、state、twister就比较奇怪,令人捉摸不透,不知道该选用哪个。这实际上是产生随机数的不同算法。
seed表示采用v4版本的随机数产生器,state是v5版本的随机数产生器,最后的twister用的则是Mersenne Twister随机数产生器。
那么具体该用哪一个呢?在新版本的语法说明中,Matlab给出了答案:前两个随机数产生器都是“flawed”,推荐大家使用twister随机数产生器。
此外,MathWorks公司意识到了这几个参数可能会产生误导,于是在新版本(2012及以后)的Matlab中更新了语法。
rng(1);
A = rand(2,2); rng('shuffle')
A = rand(2,2);
新版的Matlab默认采用Mersenne Twister随机数产生器,rng(S) 函数表示设定初始状态,rng('shuffle') 表示随机分配一个初始状态。
所以现在只需要记住rng()函数设置初始状态,然后用rand产生随机数就可以了。
然而,有时我们只需要“真正”的伪随机数(不重复!),如何得到?
4.2 产生非重复随机数
用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天种子才会重复一次,一般使用的话足够了。
参考文献:百度知道
http://cn.mathworks.com/help/matlab/math/generate-random-numbers-that-are-different.html
Matlab中rand('state',sum(clock))解析的更多相关文章
- 【原创】Matlab中plot函数全功能解析
[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...
- Matlab中plot函数全功能解析
Matlab中plot函数全功能解析 功能 二维曲线绘图 语法 plot(Y)plot(X1,Y1,...)plot(X1,Y1,LineSpec,...)plot(...,'PropertyName ...
- Matlab中bsxfun和unique函数解析
一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...
- Matlab中Rand()函数用法
一.理论准备 matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法:Y = randn(n),返回一个n*n的随机项的矩阵.如果n不是 ...
- Matlab中plot函数参数解析
功能 二维曲线绘图 语法 plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...) plot(...,'PropertyName',PropertyValue, ...
- matlab中randn(‘state’)
matlab中randn(‘state’)转载:http://www.cnblogs.com/rong86/p/3572284.html randn('state') 随机数都是由RandStream ...
- 学习笔记(1)---matlab中常见函数解析
一.fscanf函数 matlab中函数fscanf在文件读取方面的实例如下: 从文件中有格式地读数据 fscanf 语法1:[a,count]=fscanf(fid,format,size) 根据指 ...
- MATLAB中冒号的用法解析
MATLAB中冒号的用法解析 1.: 表示所有的意思. (1)如:a(1,:) 表示a的第1行,示例: 结果: 同样的如果a(2,:)表示a的第2行 (2)反过来,a(:,2) 表示a的第3列,示例: ...
- Vue Vuex中的严格模式/实例解析/dispatch/commit /state/getters
严格模式 import getters from './getters' import mutations from './mutations' import actions from './acti ...
随机推荐
- Tomcat - JNDI 配置
1. Create Your JavaBean Class Create the JavaBean class which will be instantiated each time that th ...
- Linux - 硬链接与软链接
在 Linux 的文件系统中,磁盘块分成了 3 个部分.一部分称为数据区,用来存放文件内容.另一部分称为 inode 表,用来存放文件属性.第三部分称为超级块,用来存放文件系统本身的属性.文件的内容和 ...
- Jquery 获得服务器控件值的方法小结(转)
由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法. <!--服务器控件代码:--> <asp:Tex ...
- ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...
- 第五十七篇、AVAssetReader和AVAssetWrite 对视频进行编码
AV Foundation提供了直接处理媒体样本的低级功能,其中需要使用的两个重要的类,AVAssetReader和AVAssetWrite,AVAssetReader用于从AVAsset资源读取媒体 ...
- iOS 9 之后更改状态栏字体颜色
设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...
- Tab 防刷新
今天发现项目中有个小毛病,就是tab老是刷新,就上网Copy了一份防止刷新的Tab例子,谢咯. 贴上来参考一下: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- js画了一个椭圆
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C/C++中浮点数格式学习——以IEEE75432位单精度为例
这是浮点数的通常表示形式,在IEEE754中,单精度浮点数有如下形式: 位单精度 个比特存储. 位长 至23偏正值(实际的指数大小+127) 至0位编号(从右边开始为0) S为符号位,Exp为指数字, ...
- IOS中一个简单的粒子效果实现
1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒 ...