ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA用数组随机随机 有什么问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-26 19:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
记得以前提出过此问题,我还为此帮他写过代码。当时不是200次,好象是上千上万次的。

TA的精华主题

TA的得分主题

发表于 2017-6-26 19:35 | 显示全部楼层
用VBA数组随机模拟硬币正反面出现次数
http://club.excelhome.net/thread-1343542-1-1.html
(出处: ExcelHome技术论坛)

TA的精华主题

TA的得分主题

发表于 2017-6-26 19:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还是忍不住手痒:
  1. Sub tst()
  2. Set d = CreateObject("scripting.dictionary")
  3. For i = 1 To 200
  4. Select Case Int(Rnd * 2) & Int(Rnd * 2)
  5. Case "00": ss = "正正"
  6. Case "01": ss = "正反"
  7. Case "10": ss = "正反"
  8. Case "11": ss = "反反"
  9. End Select
  10. d(ss) = d(ss) + 1
  11. Next
  12. [a1].Resize(3, 2) = Application.Transpose(Array(d.keys, d.items))
  13. End Sub
复制代码
下次发帖,来点真正意义上的实际编写代码时遇到的困难,不要脑壳一冒泡,就考考大家,还摆出一副老师改作业的范!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub 随机模拟_200()
  2.     Dim a&(2), i&, m&
  3.     Randomize
  4.    
  5.     m = 200
  6.     Debug.Print vbCr; "模拟"; m; "次结果"
  7.    
  8.     For i = 0 To m - 1
  9.         If Rnd < 0.5 Then '正
  10.             If Rnd < 0.5 Then '正正
  11.                 a(0) = a(0) + 1
  12.             Else '正反
  13.                 a(1) = a(1) + 1
  14.             End If
  15.         Else '反
  16.             If Rnd < 0.5 Then '反正
  17.                 a(1) = a(1) + 1
  18.             Else '反反
  19.                 a(2) = a(2) + 1
  20.             End If
  21.         End If
  22.     Next
  23.    
  24.     Debug.Print "两个正面出现:"; a(0); "次."; Format(a(0) / i, "0.000%")
  25.     Debug.Print "两个反面出现:"; a(1); "次."; Format(a(1) / i, "0.000%")
  26.     Debug.Print "一正一反出现:"; a(2); "次."; Format(a(2) / i, "0.000%")
  27. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:21 | 显示全部楼层
yayahzmeng 发表于 2017-6-26 19:56
还是忍不住手痒:下次发帖,来点真正意义上的实际编写代码时遇到的困难,不要脑壳一冒泡,就考考大家,还摆 ...

为啥要用字典?没有字典不能活了!哈哈

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:27 | 显示全部楼层
yayahzmeng 发表于 2017-6-26 19:56
还是忍不住手痒:下次发帖,来点真正意义上的实际编写代码时遇到的困难,不要脑壳一冒泡,就考考大家,还摆 ...

你的代码这样改:

  1. Sub test()
  2.     Dim a&(2)
  3.     For i = 1 To 200
  4.         t = Int(Rnd * 2) + Int(Rnd * 2)
  5.         a(t) = a(t) + 1
  6.     Next
  7.     [a1].Resize(, 3) = Array("反反", "反正/正反", "正正")
  8.     [a2].Resize(, 3) = a
  9. End Sub
复制代码


2个硬币的随机结果 0/1 组合之和只有3种: 0/1/2
1. 正+正 = 1 + 1 =2
2. 正+反 = 1 + 0 =1
3. 反+正 = 0 + 1 =1
4. 反+反 = 0 + 0 =0

以上。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不过,回到本次发帖,还是很好的,既摆出了自己的代码,提出了不完善,也要求帮助修改,只是忘记了原来已经得到过帮助。

那就指指问题吧:
Dim a(1 To 200) As Integer      '仅仅只定义了个一位数组
Dim x%, y%, z%, i%
Randomize
Debug.Print "模拟200次结果"
For i = 1 To 200
a(i) = Int(Rnd * 3) + 1            '此处实际只描述了抛1次的概率,且a(i)=1 or 2 or 3 的概率分别占33.33333%,
                                             '与单个硬币要么正要么反的概率完全不同
                                             '你抛硬币能 正、反、正反 各占1/3,那你就是神人了
                                             '更不是同时抛2个硬币的概率
                                             '此处错了,后面循环计数就毫无意义
Next

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
对数组的应用还没到女侠你的出神入化的地步,思维有点僵,仅仅感觉代码会更简短些,哈哈哈

比如本例,和你一样,我也不记下产生的硬币结果数组,而是直接判断每次结果并计数,但我本能地想到用字典,而你直接用个变量就解决了(说道这,发现你代码中也不需要dim a&(2)哈哈!)

TA的精华主题

TA的得分主题

发表于 2017-6-26 20:50 | 显示全部楼层
照原来的改

  1. Sub 随机模拟有什么问题()
  2. Dim a(1 To 200, 1 To 2) As Integer
  3. Dim x%, y%, z%, i%
  4. Randomize
  5. Debug.Print "模拟200次结果"
  6.     For i = 1 To 200
  7.         a(i, 1) = Int(Rnd * 2) + 1
  8.         a(i, 2) = Int(Rnd * 2) + 1
  9.         If a(i, 1) + a(i, 2) = 4 Then '正
  10.             x = x + 1
  11.         ElseIf a(i, 1) + a(i, 2) = 2 Then   '反
  12.             y = y + 1
  13.         ElseIf a(i, 1) + a(i, 2) = 3 Then   '一正一反
  14.             z = z + 1
  15.         End If
  16.     Next i
  17. Debug.Print "两个正面出现:" & x & "次."
  18. Debug.Print "两个反面出现:" & y & "次."
  19. Debug.Print "一正一反出现:" & z & "次."
  20. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-6-26 21:43 | 显示全部楼层
本帖最后由 yayahzmeng 于 2017-6-26 21:50 编辑


哎,女侠这一改,赏心悦目啊,两者一加,直接去掉每步的if或case和字典,化腐朽为神奇,效率提高进10倍,太棒了!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 22:44 , Processed in 0.037539 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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