Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5234|回复: 7

[已解决]1-6个自然数随机生成3位数

[复制链接]
发表于 2015-3-2 17:08 | 显示全部楼层 |阅读模式
1-6个自然数随机生成3位数的全排列5万个或更多(可重复),请问各位老师如何用VBA实现?例如:123,222,111,456,654,231,谢谢!~
最佳答案
2015-3-3 08:44
因为是3位数,且不含0(不用考虑首位0显示)

所以,以下数值处理方式速度比上面的字符处理法方式速度快一倍(但仍比5楼代码慢很多)
  1. Sub test3()
  2.     Dim i&, j&, m&, t&, tms#
  3.     tms = Timer
  4.     m = 50000
  5.     ReDim ar&(1 To m, 1 To 1)
  6.     Randomize
  7.     For i = 1 To m
  8.         t = 0
  9.         For j = 0 To 2
  10.             t = t + Int((Rnd * 6) + 1) * 10 ^ j
  11.         Next
  12.         ar(i, 1) = t
  13.     Next
  14.     Debug.Print Format(Timer - tms, "0.000s")
  15.     [c1].Resize(m) = ar
  16. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-3-2 17:18 | 显示全部楼层
回复

使用道具 举报

发表于 2015-3-2 17:20 | 显示全部楼层
回复

使用道具 举报

发表于 2015-3-2 18:17 | 显示全部楼层
看看是不是想要的

随机.zip

6.18 KB, 下载次数: 14

回复

使用道具 举报

发表于 2015-3-2 18:47 | 显示全部楼层
  1. Sub Macro1()
  2. Dim w(1 To 6 ^ 3), arr, i&, j%, k%, s%
  3. Const n As Long = 50000
  4. ReDim arr(1 To n, 1 To 1)
  5. For i = 1 To 6
  6.     For j = 1 To 6
  7.         For k = 1 To 6
  8.             s = s + 1
  9.             w(s) = i & j & k
  10.         Next
  11.     Next
  12. Next
  13. For i = 1 To n
  14.     x = Int(Rnd * s + 1)
  15.     arr(i, 1) = w(x)
  16. Next
  17. Range("a1").Resize(n) = arr
  18. End Sub
复制代码

点评

群子把楼主带进坑里了,呵呵……你的方法虽好,但不是初学者容易理解的做法。  发表于 2015-3-4 11:12
回复

使用道具 举报

发表于 2015-3-3 08:40 | 显示全部楼层
1-6生成3位数有=6*6*6=216种完全不同的排列组合。

5楼dsmch代码,首先生成全部216种排列,然后再通过随机函数从中抽取5万个3位数。
这样计算速度较快。

而普通直接思维的算法,是每次从1-6中随机抽取1个数,连续3次生成1个随机数合并为1个3位数。
重复5万次。这样速度会慢一些。

4楼就是这样的思路,5万个的代码如下:
  1. Sub sj()
  2.     Dim i&, j&, m&, s$, tms#
  3.     tms = Timer
  4.     m = 50000
  5.     ReDim ar(1 To m, 1 To 1)
  6.     s = "000"
  7.     Randomize
  8.     For i = 1 To m
  9.         For j = 1 To 3
  10.             Mid(s, j, 1) = Int((Rnd * 6) + 1)
  11.         Next
  12.         ar(i, 1) = s
  13.     Next
  14.     Debug.Print Format(Timer - tms, "0.000s")
  15.     [b1].Resize(m) = ar
  16. End Sub
复制代码
回复

使用道具 举报

发表于 2015-3-3 08:44 | 显示全部楼层    本楼为最佳答案   
因为是3位数,且不含0(不用考虑首位0显示)

所以,以下数值处理方式速度比上面的字符处理法方式速度快一倍(但仍比5楼代码慢很多)
  1. Sub test3()
  2.     Dim i&, j&, m&, t&, tms#
  3.     tms = Timer
  4.     m = 50000
  5.     ReDim ar&(1 To m, 1 To 1)
  6.     Randomize
  7.     For i = 1 To m
  8.         t = 0
  9.         For j = 0 To 2
  10.             t = t + Int((Rnd * 6) + 1) * 10 ^ j
  11.         Next
  12.         ar(i, 1) = t
  13.     Next
  14.     Debug.Print Format(Timer - tms, "0.000s")
  15.     [c1].Resize(m) = ar
  16. End Sub
复制代码

点评

群子把楼主带进坑里了,呵呵  发表于 2015-3-4 06:19
回复

使用道具 举报

 楼主| 发表于 2015-3-3 21:11 | 显示全部楼层
感谢楼上老师的指导 都能实现!~
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 23:45 , Processed in 0.335895 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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