ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-3-10 13:36 | 显示全部楼层
洛天依 发表于 2013-3-10 12:14
谢谢群子老师讲解了这么多知识,受益不少!
像8楼知识,不是帮助里的吧,是从哪方面打听到的呀?

帮助里没有的……也没有地方打听得到哦。

呵呵,你就当那是我自己瞎编的啦……哈哈。

TA的精华主题

TA的得分主题

发表于 2013-3-10 13:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
洛天依 发表于 2013-3-10 13:31
1)当rud(number)的number

你这说法不正确。

不知道你想要总结出什么……

总之,每一种情形结果都是不同的。

…………

应该这么理解:
VBA中的Rnd()函数实际上每次被调用函数时都会有一个【种子】被作为算法的计算值。

即 Rnd=f(x)
其中,f()是生成16777216乱序伪随机数序列位置的一种算法,
x就是算法需要的种子。 是一个单精度小数。

…………

点评

群子老师收徒吗?我跟你学!  发表于 2013-3-10 13:45

TA的精华主题

TA的得分主题

发表于 2013-3-10 14:10 | 显示全部楼层
1)当rud(number)的number<0时
    以这个负的单精度数值作为随机种子,用【算法】计算生成伪随机乱数序列的位置。

2)当randomize带参数时
    以这个参数再加上Rnd函数当前位置作为随机种子,用【算法】计算生成伪随机乱数序列的位置。

3)当randomize不带参数时
    以系统时刻的timer秒值作为参数再加上Rnd函数当前位置作为随机种子,用【算法】计算生成伪随机乱数序列的位置。


4)EXCEL启动时
   固定从伪随机乱数序列的第一个值开始返回随机乱数序列。
   序号开始值=11837123,返回随机小数=0.705547511577606


TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-10 14:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
香川群子 发表于 2013-3-10 13:36
帮助里没有的……也没有地方打听得到哦。

呵呵,你就当那是我自己瞎编的啦……哈哈。

比如2^24个,这是结合某些条件(各种知识),算出来的吧?
对此,从帮助里我是找不到什么线索的

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-3-10 15:28 | 显示全部楼层
本帖最后由 洛天依 于 2013-3-15 11:42 编辑
香川群子 发表于 2013-3-10 13:43
你这说法不正确。

不知道你想要总结出什么……


谢谢了

TA的精华主题

TA的得分主题

发表于 2013-4-5 21:16 | 显示全部楼层
本帖最后由 灰袍法师 于 2013-4-5 21:19 编辑
洛天依 发表于 2013-3-10 14:46
比如2^24个,这是结合某些条件(各种知识),算出来的吧?
对此,从帮助里我是找不到什么线索的

2^24自己写VBA代码,取 2^24 个随机数,你将发现第 2^24 个随机数正好等于 第1个随机数,随后就是不断重复第2,第3,第4个随机数。
所以说其周期是 2^24

VBA 使用的 rnd 函数,其算法在这里
http://support.microsoft.com/kb/231847
总的来说,一个周期只有 2^24 的随机数生成器,是不够好的。
如果需要 2^25 个0-1的32位小数随机数,那么将会发现每个数值刚好出现2次。
对于远远低于 2^24 的随机数需求来说,如学校几千人随机排名抽签之类,就没问题。  

而另一方面,Excel 的单元格公式 rand()其实更强大,微软也公开其算法
这里有我发布的完整算法以及实现该算法的VBA代码。

请直接看第11楼,前面的都是废话。
RAND函数会重复吗?
http://club.excelhome.net/thread-673711-1-1.html


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-4-6 08:11 | 显示全部楼层
Microsoft Visual Basic 使用 RND 函数得到伪随机数字是用了【生成线性值求同余】的算法。

算法公式如下:
   x1 = ( 【上一次随机序列值】x0 * 【固定斜率】a + 【固定值】c ) MOD (2^24)
                               
其中:

x 1 = 计算结果,即【随机序列值】的新值
x 0 = 未使用Randomize初始化时,每次的计算初始值为 327680
        接下来就是使用x1即前一个计算结果值作为参数 (x0=x1)
a = 1140671485
c = 12820163
2^24=16777216

根据上面的算法公式,则 MOD 运算以后得到的结果范围是[0-16777215]
因此,随机函数值范围为 [0- 16777215/16777216] 即 [0-1)(不含=1)

…………
这个算法虽然知道了,但一般无法在Excel中直接进行工作表函数的验证
(因为mod函数处理不了【长数位值】)


我用自己编写的自定义函数验证了是正确的。


表达式 x1/(2^24) 将返回介于 0.0 和 1.0 RND 函数所返回的浮点数。

请注意不能在 Visual Basic 代码中可以重现 RND 函数生成的随机编号规则的方式实现上述算法。这是因为内部 Visual Basic 使用无符号的长数据类型由 Visual Basic 语言不受支持。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-6-24 17:19 | 显示全部楼层
学习Randomize。

点评

怎么今天想起学这个……这个帖子又是怎么被你找到的。呵呵。  发表于 2013-6-24 19:57

TA的精华主题

TA的得分主题

发表于 2014-4-2 14:53 | 显示全部楼层
香川群子 发表于 2013-3-9 11:24
如果使用了Randomize语句时,默认将以系统计时器返回的值作为新的种子值,
因此种子不同,算法将返回不同的 ...

小小一个语句,背后居然此等学问,真是开了眼界。。。

TA的精华主题

TA的得分主题

发表于 2014-4-2 15:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-3-9 12:11
使用带固定参数的Randomize方法,每次运行返回固定【伪随机数序列】的试验代码:呵呵。
  1. Sub GetRnd()
  2.     For t = 0 To 3
  3.         r = Rnd() '必须在一开始使用【负数参数】让Rnd定位于序列中某个位置
  4.         Cells(1 + t * 6, 1) = r
  5.         For j = 1 To 3
  6. '            Randomize (j) '随机种子以【固定方式】【初始化】
  7.             For i = 1 To 5
  8.                 Cells(i + t * 6, 1 + j) = Rnd '此时每次运行返回完全相同的【伪随机数】序列。
  9.             Next
  10.         Next
  11.     Next
  12. End Sub
复制代码
可问题是我把你的代码做了以上修改后,就可以得到不同的随机数序列了。。。这样一来是不是Randomize就没啥实质性的作用了。。。看了很多,越发糊涂了,也许应该放开高深的原理,讲讲使用与不使用在实现功能和效果上的差别。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-22 18:42 , Processed in 0.045929 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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