MATLAB中随机数产生中的"state", "seed", "twister"用法
2016-10-14 22:05
381 查看
文章转自:点击打开链接
众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:
<span style="color:#000000;">>> 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</span>可以看到,第三次产生随机数,因为初始状态都是0,所以产生了完全一样的随机数!
[align=left]设定初始状态的好处是,只需要保存那时的初始状态再运行一遍程序你就可以重现之前的计算过程和结果。
[/align]
[align=left]缺点是虽然程序使用了随机数,但由于(每次启动后)初始状态一样,实际运行出来却是相同的重复过程,你需要人工设定一个保证随机性的初始状态。[/align]
[align=left]
[/align]
[align=left]Part A: 如何设置初始状态?[/align]
[align=left]设置随机数初始状态有三种语法形式,如下:[/align]
[align=left]
新版的Matlab默认采用Mersenne Twister随机数产生器,rng(S) 函数表示设定初始状态,rng('shuffle') 表示随机分配一个初始状态。
所以现在只需要记住rng()函数设置初始状态,然后用rand产生随机数就可以了。[/align]
[align=left]然而,有时我们只需要“真正”的伪随机数(不重复!),如何得到?[/align]
[align=left]Part B: 如何产生非重复的随机数
[/align]
[align=left]
[/align]
[align=left] 2012版本之后的用户比较方便,在产生随机数之前使用rng('shuffle')洗一下就可以(shuffle是洗牌的意思)。[/align]
[align=left] 而旧版本的用户,还不支持rng函数。以前推荐的是rand('state',sum(100*clock))来根据当前时间设定初始状态,但时间始终是递增的,而且变化幅度相对来说很小,效果不是很好。[/align]
有很多人用别的方式设定初始状态(如rand('twister', fix(mod(1e11*(sum(clock)-2009), 2^31)));),为简便起见,个人推荐采用新版Matlab中rng函数语法,即:
每次如此设置初始状态后即可产生不同的随机数。大约每497天种子才会重复一次,对于一般使用是足够了。
众所周知,Matlab中的rand()函数产生的是伪随机数,但一般用来也可以接受。但是,如果我们知道伪随机数的初始状态,那么产生的伪随机数是唯一确定的。问题来了,Matlab每次启动会重置rand()和randn()的初始状态(重置为0),也就是说,你产生的随机数会出现两次随机数一模一样的情况,如:
<span style="color:#000000;">>> 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</span>可以看到,第三次产生随机数,因为初始状态都是0,所以产生了完全一样的随机数!
[align=left]设定初始状态的好处是,只需要保存那时的初始状态再运行一遍程序你就可以重现之前的计算过程和结果。
[/align]
[align=left]缺点是虽然程序使用了随机数,但由于(每次启动后)初始状态一样,实际运行出来却是相同的重复过程,你需要人工设定一个保证随机性的初始状态。[/align]
[align=left]
[/align]
[align=left]Part A: 如何设置初始状态?[/align]
[align=left]设置随机数初始状态有三种语法形式,如下:[/align]
[align=left]
<span style="color:#000000;">rand('seed', S)</span>
新版的Matlab默认采用Mersenne Twister随机数产生器,rng(S) 函数表示设定初始状态,rng('shuffle') 表示随机分配一个初始状态。
所以现在只需要记住rng()函数设置初始状态,然后用rand产生随机数就可以了。[/align]
[align=left]然而,有时我们只需要“真正”的伪随机数(不重复!),如何得到?[/align]
[align=left]Part B: 如何产生非重复的随机数
[/align]
[align=left]
[/align]
[align=left] 2012版本之后的用户比较方便,在产生随机数之前使用rng('shuffle')洗一下就可以(shuffle是洗牌的意思)。[/align]
[align=left] 而旧版本的用户,还不支持rng函数。以前推荐的是rand('state',sum(100*clock))来根据当前时间设定初始状态,但时间始终是递增的,而且变化幅度相对来说很小,效果不是很好。[/align]
有很多人用别的方式设定初始状态(如rand('twister', fix(mod(1e11*(sum(clock)-2009), 2^31)));),为简便起见,个人推荐采用新版Matlab中rng函数语法,即:
<span style="color:#000000;">rand('twister',mod(floor(now*8640000),2^31-1));</span>
每次如此设置初始状态后即可产生不同的随机数。大约每497天种子才会重复一次,对于一般使用是足够了。
相关文章推荐
- 产生随机数rand和randn中的“state”、“seed”和"twister"参数
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- matlab的rand()函数产生均匀分布函数的正确用法 / matlab 中如何产生0-1上均匀分布的随机数
- MATLAB——rand 与 randn 'twister'、'state'、'seed'
- Matlab产生随机数函数rand和randn的“state”和“seed”参数
- 【matlab】在vc6.0中调用matlab中的正态分布产生随机数
- matlab产生符合某个分布的随机数序列
- C/C++中产生随机数(rand,srand用法)
- C/C++中产生随机数(rand,srand用法)
- 笔记2-"test"命令的用法
- 使用LinqDataSource出现“找不到与ViewState中存储的原始值中的给定键相匹配的行,请确保"keys"字典包含与上一个Select操作返回的行对应的唯一键值”错误的解决办法
- JS产生随机数的几个用法!
- Matlab中产生正态分布随机数的函数normrnd
- 关于 把 session 保存 sql server 中 、 无法打开登录所请求的数据库 "ASPState"。登录失败。 用户 'sa' 登录失败。
- C/C++中产生随机数(rand,srand用法)
- c++的break和continue的"标签用法"
- [转]C/C++中产生随机数(rand,srand用法)
- Firefox3下<object>标签导致产生空白的"bug"
- C/C++中产生随机数(rand,srand用法)