ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] RAND函数会重复吗?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-6-17 22:22 | 显示全部楼层
不错,学习学习

TA的精华主题

TA的得分主题

发表于 2011-6-21 05:38 | 显示全部楼层
哈,改良了程序,运行20小时就得到 rand 的周期了, core 2 duo 2.13ghz,最终CPU温度高达70摄氏度啊!

数字是 69536 0787 1644, 即6.9536万亿

其算法采用的三个取模数字 30269, 30307, 30323, 取模结果将分别生成 30268, 30306, 30322个数字(即不包括数字0在内的所有数字)

而rand 的周期 刚好是这三个数字的最小公倍数,也真难为算法的作者能够找到这么刚刚好的数字组合了。

附件是VB程序和源代码,注意是64位程序,只能在64位windows下运行。

[ 本帖最后由 灰袍法师 于 2011-6-21 17:51 编辑 ]

检查rand函数的周期.rar

5.57 KB, 下载次数: 31

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-6-21 06:36 | 显示全部楼层
原帖由 灰袍法师 于 2011-6-21 05:38 发表
哈,改良了程序,运行20小时就得到 rand 的周期了, core 2 duo 2.13ghz,最终CPU温度高达70摄氏度啊!

数字是 69536 0787 1644, 即6.9536万亿

其算法采用的三个取模数字 30269, 30307, 30323, 取模结果将分别 ...

法师有心了,好好学习理解。

TA的精华主题

TA的得分主题

发表于 2011-7-20 20:35 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太厉害了。灰袍法师是干啥子高级工作的呢。

TA的精华主题

TA的得分主题

发表于 2011-7-20 21:48 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-11-17 11:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
唉,功力太浅,没有搞懂rand()在周期内不重复,为什么rand()*(b-a)+a就有可能重复呢

TA的精华主题

TA的得分主题

发表于 2011-11-17 18:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 灰袍法师 于 2011-11-17 20:02 编辑
onthetrip2008 发表于 2011-11-17 11:02
唉,功力太浅,没有搞懂rand()在周期内不重复,为什么rand()*(b-a)+a就有可能重复呢

如果你要的是 生成1-100的随机整数101个,那么就一定有重复
如果你要的是 0-0.5的随机小数100个,那么有极其微小的可能出现重复,因为 rand 是 0-1范围,周期内不重复,也就是说把RAND /2 变成 0-0.5的话,每两个 0-1 的数对应同一个 0-0.5的数。
如果你要的是 0-2 的随机小数6.95万亿个,那么理论上就不可能出现重复,但是不排除浮点运算产生的误差,导致两个在 0-1 范围的相邻小数,乘以2以后变成同一个数。。。

TA的精华主题

TA的得分主题

发表于 2011-11-17 19:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
灰袍法师 发表于 2011-11-17 18:50
如果你要的是 生成1-100的随机整数101个,那么就一定有重复
如果你要的是 0-0.5的随机小数,那么有微小的 ...

看得云里雾里,法师能不能讲得更浅显些?

TA的精华主题

TA的得分主题

发表于 2011-11-17 20:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 灰袍法师 于 2011-11-17 20:15 编辑
bluexuemei 发表于 2011-11-17 19:18
看得云里雾里,法师能不能讲得更浅显些?

假设一个随机数生成器 RAND gen 的周期是10,生成0-9的整数
生成的序列是:1,7,3,2,6,9,4,5,8,0
那么你用这个序列生成 11 个随机数,就100%有重复
生成10个随机整数,就100%没有重复
生成0-1的随机整数,int (rand gen /5) 。。。
1,7,3,2,6,9,4,5,8,0
变成
0,1,0,0,1,1,0,1,1,0
随机数有没有重复就看你从什么范围取,取多少个。
我实在不理解这有什么难懂的?
随机数生成器本身不重复 跟 生成的随机数再次生成指定范围的随机数有重复 是两码事,为毛要混为一谈呢?

TA的精华主题

TA的得分主题

发表于 2011-11-17 21:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
法师说的很对。


随机数、和重复数,实际上本来就是两个不同的概念。


仅仅因为大家喜欢利用随机数(随机系列生成器产生的序列数),
然后用某种算法来得到一个极小区间(相对于随机系列区间)中的序列,
因此就产生了可能会得到重复值的担心。


然而,要保证绝对不重复,采用的算法是很多,也很简单的。

比如洗牌法(抽牌法)

即,用【随机数】来保证【随机性】,用【算法】来保证【不重复】。



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

本版积分规则

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

GMT+8, 2024-5-14 09:29 , Processed in 0.042825 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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