Matlab中rand('state',sum(clock))解析

简介: 一.问题来源   来自于一份PSO代码,PSO中需要初始化粒子位置和速度。 二.问题探究   众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。

一.问题来源

  来自于一份PSO代码,PSO中需要初始化粒子位置和速度。

二.问题探究

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

 1 >> rand('state',0) 
 2 >> rand(3,1)
 3 
 4 ans =
 5 
 6     0.9501
 7     0.2311
 8     0.6068
 9 
10 >> rand(3,1)
11 
12 ans =
13 
14     0.4860
15     0.8913
16     0.7621
17 
18 >> rand('state',0)
19 >> rand(3,1)
20 
21 ans =
22 
23     0.9501
24     0.2311
25     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:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
matlab:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
1767 0
matlab:在FUNCTION处出现解析错误:使用的MATLAB语法可能无效。
|
3月前
|
数据可视化
第七章:MATLAB基本运算符号解析及案例详解
第七章:MATLAB基本运算符号解析及案例详解
26 1
|
6月前
|
存储 算法 Serverless
MATLAB匿名函数解析
MATLAB匿名函数解析
65 0
|
8月前
|
算法 Perl
基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)
基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)
|
10月前
|
数据挖掘 数据安全/隐私保护 开发者
MATLAB P文件解密工具让你轻松破解p文件,解析源代码!
这篇文章将为你推荐一个MATLAB P文件解密工具,可以将p文件解密成m文件,反编译p代码为m代码,并还原p文件或m文件的源代码。
1024 0
|
10月前
|
索引
MATLAB矩阵和数组相关函数解析
MATLAB矩阵和数组相关函数解析
|
人工智能 算法
Ostu算法的Matlab源代码以及程序解析
Ostu算法的Matlab源代码以及程序解析
|
索引
Matlab中sortrows函数解析
一.问题来源   返回检索到的数据(按相关度排序)在原始数据中的索引。 二.问题解析   x = [1 4 3 5; 1 3 2 6];sortrows(x)其结果是按照row来排列,默认首先排第一列,1和1一样大,那么排第二列,3比4小,所以1 3 2 6应该在第一行。
1031 0
|
人工智能 BI C语言
Matlab中bsxfun和unique函数解析
一.问题来源   来自于一份LSH代码,记录下来。 二.函数解析 2.1 bsxfun   bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-by-element binary operation to arrays a and b, with singleton expansion enabled。
1317 0

推荐镜像

更多