ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

请教如何产生非时间性的随机数?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-4-29 17:26 | 显示全部楼层 |阅读模式
最近写了一段代码,但每一次结果都一样,想问一下,这是不是时间性随机数导致的结果,有其他方法吗?

由于代码比较多,所以简化表示一下:
前题,在某单据表中取出当月开具的所有票据的日期,然后去重把序好到一个字典中:dic
    arr_x = Application.Transpose(dic.keys)
    i = dic.Count
    Set dic = Nothing
   
    Sheets("临时表").Select
    Range("B1").Select
    For ii = 1 To loopi
        Range("B" & ii).Value = arr_x(Int((Rnd * i) + 1), 1)
    Next

然后在B列中对乱序的日期进行排序
    Columns("B:B").Select
    ActiveWorkbook.Worksheets("临时表").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("临时表").Sort.SortFields.Add Key:=Range("B1:B" & loopi), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("临时表").Sort
        .SetRange Range("B1:B" & loopi)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

结果却完全一样,各个日期出现的次数都变成固定的,只有在调试模式下,在fox rnd中手工运行下一步才会得到不一致的结果,请教各位大大,有办法解决吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 17:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
比如说, 1月1日出现5次,1月10日出现6次,1月22日出现3次,每运行一次都是这个结果“1月1日出现5次,1月10日出现6次,1月22日出现3次",这样就只能说出现顺序变了,但出现数量不顺机了

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 17:31 | 显示全部楼层
比如说, 1月1日出现5次,1月10日出现6次,1月22日出现3次,每运行一次都是这个结果“1月1日出现5次,1月10日出现6次,1月22日出现3次",这样就只能说出现顺序变了,但出现数量不顺机了

TA的精华主题

TA的得分主题

发表于 2024-4-29 18:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在过程开头加入随机种子语句:

Randomize
For ii = 1 To loopi
    Range("B" & ii).Value = arr_x(Int((Rnd * i) + 1), 1)
Next

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 18:20 | 显示全部楼层
山菊花 发表于 2024-4-29 18:02
在过程开头加入随机种子语句:

Randomize

谢谢大大,每次都有变化了,
难道,vba中保存了某个程序使用随机数的“纹路”?  这程序是半个月前运行过一次,今天运行才发现完全一样的
Randomize的作用是打散了已存储的随机”纹路“?
捕获.PNG

TA的精华主题

TA的得分主题

发表于 2024-4-29 18:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
E2{=INDEX(B:B,SMALL(IF(C$2:C$4>=COLUMN(A:Z),{2;3;4},99),ROW(A1)))&""

F2區域數組公式{=INDEX(B:B,RIGHT(SMALL(IF(C2:C4>=COLUMN(A:Z),RANDBETWEEN(({2;3;4}*26-16+COLUMN(A:Z))^0,999)/1%+{2;3;4}),ROW(INDIRECT("1:"&SUM(C2:C4))))))

F2:F17格式化 字色白=ISNA(F2)
12704.png

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 18:30 | 显示全部楼层
查了此指令,百度结果留个印:
1 VBA中直接使用 rnd,是一个公式计算出来的模拟(伪随机)
2 伪随机数会带来什么问题:永远是同一组随机数
如果想每次生成的随机数,本次程序运行结束前都一样,下次计算时不一样。就用  randmize  和 rnd(0)
如果想永远生成不同的随机数,无论是序列内,还是在不同的环境重新运行都不同,就用   randmize  和 rnd(1) 或 randmize 和 rnd  缺省就可以。

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-4-29 18:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 zshowell 于 2024-4-29 18:47 编辑
hcm19522 发表于 2024-4-29 18:26
E2{=INDEX(B:B,SMALL(IF(C$2:C$4>=COLUMN(A:Z),{2;3;4},99),ROW(A1)))&""

F2區域數組公式{=INDEX(B:B,RI ...

谢谢你的帮助,这种指定出现次数的随机单元格出现的方法,原来还可以使用公式来实现,开眼界了。

TA的精华主题

TA的得分主题

发表于 2024-4-30 09:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zshowell 发表于 2024-4-29 18:45
谢谢你的帮助,这种指定出现次数的随机单元格出现的方法,原来还可以使用公式来实现,开眼界了。:lovelin ...

(後段多取 無須格式化) F2區域數組公式{=IFERROR(INDEX(B:B,RIGHT(SMALL(IF(C2:C4>=COLUMN(A:Z),RANDBETWEEN(({2;3;4}*26-16+COLUMN(A:Z))^0,999)/1%+{2;3;4}),ROW(1:99)))),"")
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-3 08:23 , Processed in 0.036907 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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