原文链接:Matlab中rand('state',sum(clock))解析 - 火星十一郎 - 博客园
https://www.cnblogs.com/hxsyl/p/4523988.html

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

一.问题来源

  来自于一份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 如何设置初始状态

1

2

3

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中更新了语法。

1

2

3

4

5

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

打赏:为祖国开源事业添砖加瓦

作者:火星十一郎

出处:http://www.cnblogs.com/hxsyl/

本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

分享到: 更多

分类: Mathematical Modeling

18,rand('state',sum(100*clock))相关推荐

  1. 9.Matlab中的repmat,clock,rand以及seed,state,twister参数

    1.repmat  ------Replicate  and tile an array -------复制并且平铺函数 2. clock 3.rand中seed,state,以及twister参数 ...

  2. MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解

    一.问题来源: 在学习matlab中看到书上有许多关于生成随机数的应用,y书上一开始会写一个rand('state',0),注释是为了方便验证,一开始并不是很理解,最近搜索网上文章等深入理解了下关于M ...

  3. c语言学习-求1+2+3+…+100的和存入变量sum中,并将sum打印出来

    求1+2+3+-+100的和存入变量sum中,并将sum打印出来 程序流程图: 代码: #include<stdio.h> void main() {int a=1,sum=0; for( ...

  4. Python要点总结,我使用了100个小例子!

    本文提纲 1.静态/动态OR强类型/弱类型 静态类型 vs 动态 编程语言 强类型 vs 弱类型 编程语言 1.1 类型检查 类型检查是一个验证和施加类型约束的过程,编译器或解释器通常在编译或运行阶段 ...

  5. 【程序44】 题目:5文钱买一只公鸡,3文钱买一只母鸡,1文钱可以买3只小鸡,现在要用100文钱买100只鸡,那么各有公鸡,母鸡,小鸡多少只?

    [程序44] 题目:5文钱买一只公鸡,3文钱买一只母鸡,1文钱可以买3只小鸡,现在要用100文钱买100只鸡,那么各有公鸡,母鸡,小鸡多少只? package com.gyy.exercise;pub ...

  6. python生成一笔画_用Python玩烧脑小游戏《一笔画完》,瞬间闯到100关

    原标题:用Python玩烧脑小游戏<一笔画完>,瞬间闯到100关 " 昨天和朋友出去外面吃饭,吃完饭后朋友打开了一个小程序玩了起来...... 游戏长这样 大概玩法是:从地图中猫 ...

  7. c语言编程输出100以内所有6的倍数的数,第8天学C语言(一点练习,例如打印1~100之间所有3的倍数的数字)...

    (2020.9.12) 练习1:从大到小输出三个值 算法实现 a中放最大值 b次之 c最小 int a = 0; int b = 0; int c = 0; scanf_s("%d%d%d& ...

  8. 谷歌开源张量网络库TensorNetwork,GPU处理提升100倍!

    编译 |  琥珀 出品 | AI科技大本营(ID:rgznai100) 世界上许多最严峻的科学挑战,如开发高温超导体和理解时空的本质,都涉及处理量子系统的复杂性.然而,这些系统中量子态的数量程指数级增 ...

  9. 又现“别人家的公司”!网曝腾讯和快手发“阳光普照奖”,给每个员工100股股票!...

    新年到,又到了各大厂发年终福利的时候,除了年终奖,大厂们还有什么福利呢? 网曝腾讯发放阳光普照奖,全员每人100股股票,按照目前股价折算成人民币大概是6.18万,实在是良心公司! 刚刚上市的快手也不甘 ...

最新文章

  1. TinyMCE的使用-安装
  2. java linux mysql数据库_Linux Java连接MySQL数据库
  3. 脑神经计算建模揭示前额叶皮层不同类型中间神经元在信息维持中的作用
  4. 嵌入式linux内核编译感想,嵌入式Linux内核的交叉编译编译-基于2.6.26
  5. 家庭接入: dsl 电缆ftth 拨号和卫星_家庭宽带的路由器升级之路
  6. yum安装软件提示Another app is currently holding the yum lock
  7. 超生动图解LSTM和GPU:拯救循环神经网络的记忆障碍就靠它们了!
  8. Android study week1
  9. maven工具使用json-lib时,JSONArray.fromObject()不能执行的解决方案
  10. Java 模块化技术演进和对现有应用微服务化的意义
  11. 医学统计学计算机操作教程第3版附录答案,医学统计学课后习题集答案解析.doc...
  12. 2021年广东省安全员A证第三批(主要负责人)考试内容及广东省安全员A证第三批(主要负责人)新版试题
  13. SPSS典型相关分析案例
  14. 打印服务器后台程序没有运行,打印后台程序服务没有运行
  15. 回看科技股泡沫:区块链崛起恰逢其时,相当于1996年的互联网
  16. 思科下一代模拟器EVE-NG做一个思科交换机用作DHCP服务器实验
  17. Unraid USB启动盘怎么更换和重新获取注册码密钥?
  18. 2022学生党蓝牙耳机怎么选?最新蓝牙耳机排行榜
  19. win32 窗口 绘制矩形
  20. 【高等数学】定积分的应用

热门文章

  1. 在 Azure 上部署 Asp.NET Core Web App
  2. Oracle procedure
  3. c#操作Excel整理总结
  4. Pjax是什么以及为什么推荐大家用
  5. float向u8和s8的转换
  6. php 为啥报错,php Soap 报错 求大神帮忙看看为什么
  7. 课程表美化 css_通过这门11小时的免费课程学习HTML和CSS
  8. react创建组件_如何使用React创建时间轴组件
  9. python使用socket实现协议TCP长连接框架
  10. Wireshark使用技巧:提取VOIP通话中的音频流