ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15913|回复: 34

[已解决] 什么时候Randomize必须用

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-11-8 16:58 | 显示全部楼层 |阅读模式
本帖最后由 洛天依 于 2013-3-10 12:15 编辑

一碰到随机问题,就发现有的问题里没用 Randomize ,有的用了。

抱着标题,看到很多贴都说,如果用rnd之前不用 Randomize  ,到时会得到重复的值, ... 接下来,陷入迷糊 ... 我应该听不懂,也是站在应付实际问题的角度,就不问原理了。只是想通过示例,看到“所说的重复”,具体出现在“什么时候”,看到“为什么非用不可”,即不见棺材不流泪。

这样,下次再碰上随机问题,就知道该不该用了。
求高手给个示例说明,谢谢!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-11-8 17:23 | 显示全部楼层
初始化随机数生成器,如下面,每次打开都是同样的值:
  1. Private Sub Workbook_Open()
  2. [a1] = Int(Rnd * 100)
  3. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-8 17:45 | 显示全部楼层
Zamyi 发表于 2012-11-8 17:23
初始化随机数生成器,如下面,每次打开都是同样的值:

谢谢zamyi!

的确每次打开都是重复的。
重复是看到了


衡量一个随机问题,该不该用Randomize的标准是什么呢?

TA的精华主题

TA的得分主题

发表于 2013-3-9 10:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看帮助文件:【Randomize 语句】
      
初始化随机数生成器。

语法:Randomize [number]
可选的 number 参数是 Variant 或任何有效的数值表达式。

说明
Randomize 用 number 将 Rnd 函数的随机数生成器初始化,该随机数生成器给 number 一个新的种子值。如果省略 number,则用系统计时器返回的值作为新的种子值。


如果没有使用 Randomize,则(无参数的)Rnd 函数使用第一次调用 Rnd 函数的种子值。

注意 若想得到重复的随机数序列,在使用具有数值参数的 Randomize 之前直接调用具有负参数值的 Rnd。
使用具有同样 number 值的 Randomize 是不会得到重复的随机数序列的。


…………
呵呵,相当复杂吧。

TA的精华主题

TA的得分主题

发表于 2013-3-9 10:36 | 显示全部楼层
在调用 Rnd 之前,先使用无参数的 Randomize 语句初始化随机数生成器,
该生成器具有根据系统计时器得到的种子。



…………
种子
为初始值,用来生成伪随机数字。例如, Randomize 语句创建一种子值供 Rnd 函数使用,以接着创建唯一伪随机数列。

TA的精华主题

TA的得分主题

发表于 2013-3-9 10:51 | 显示全部楼层
再来看Rnd的说明文件:

Rnd 函数
      

返回一个包含随机数值的 Single。

语法

Rnd[(number)]

可选的 number 参数是 Single 或任何有效的数值表达式。

返回值

参数 number 的值的范围,以及 Rnd 生成结果:
【小于 0】 每次都使用 number 作为随机数种子得到的相同结果。
【等于 0】 最近生成的数。
【大于 0】 序列中的下一个随机数。
【省略】时和【大于 0】相同   序列中的下一个随机数。



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-3-9 10:54 | 显示全部楼层
说明

Rnd 函数返回小于 1 但大于或等于 0 的值。

而 number 的值决定了 Rnd 生成随机数的方式。

对最初给定的种子都会生成相同的数列,因为每一次调用 Rnd 函数都用数列中的前一个数作为下一个数的种子。

TA的精华主题

TA的得分主题

发表于 2013-3-9 11:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 香川群子 于 2013-3-9 11:43 编辑

补充说明:

=Rnd 实际上是把【 1 】平均分成 2^24=16777216 份,
( 16777216也可以理解为 2003工作表中 65536行*256列=sheet1中所有单元格的数量=Cells.Count)
因此每一份之间的差值=1/16777216=0.000000059604644775390625(除得尽哦!)

这样产生一个数值范围 [ 0 - 1 )
【>=0 且 <1】(或者较为精确地说是<=1-1/16777216即 [ 0 - 0.999999940395355224609375]
总数=16777216个、序列步长=1/16777216=0.000000059604644775390625 的一个序列。


更为重要的是,通过某种【算法】,已经把这16777216个数产生了分布较为均匀的乱序序列。

…………
种子是一个单精度single数值,取数范围=2^31=2147483648个
用这个种子,通过一种【算法】,就能得到一个在16777216个数中的特定位置。

但是,由于【算法】是固定的,因此这16777216个数的乱序实际上也是一个【固定的乱序】。
所以,=Rnd的结果只能被称之为【伪随机数】





评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-3-9 11:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好了,现在可以开始解释楼主的疑问了:

VBA中调用=Rnd函数时,默认取下一个种子进行【特定随机算法】,
并根据算法结果确定的序列位置,从16777216个[ 0 - 0.999999940395355]的小数中返回一个值。


…………
这样,如果不使用Randomize进行随机种子初始化时,VBA将每次使用同一种子开始进行计算,
因此返回完全相同的【伪随机数序列】

TA的精华主题

TA的得分主题

发表于 2013-3-9 11:24 | 显示全部楼层
如果使用了Randomize语句时,默认将以系统计时器返回的值作为新的种子值,
因此种子不同,算法将返回不同的【伪随机数序列】


这个就是是否使用Randomize的差别。


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-4 18:49 , Processed in 0.046091 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表