|
楼主 |
发表于 2013-1-25 13:08
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 香川群子 于 2013-1-25 13:27 编辑
vbaplus 发表于 2013-1-24 21:16
恩,我运用一下洗牌法哈~
要求生成n位随机数,这其中必须包含不重复的1,2,3,4四个数:
你的要求可以更简单地实现。
我的代码只需要随机洗牌排序4次就好了。
原理:
先循环n-4次,生成5-n位的随机字符串,结果为"1234xxxxxxx……"
然后,用经典洗牌法对1-4位进行随机交换,结果就OK啦。
因此,洗牌法的循环次数只有4次。- Function RndNum(n%)
- If n < 4 Then Exit Function
- s0 = "056789" '除1-4以外,允许随机出现的其它数值合并为字符串变量s0
- s = "1234" & String(n - 4, "0") '生成目标结果n位数的模板s "123400000……"
- For i = 5 To n '循环n-4次
- Mid(s, i, 1) = Mid(s0, Rnd() * 6 + 1, 1) '模板s="1234xxxxx……"
- Next
- For i = 1 To 4 '仅对第1-4位的1-4数值进行随机洗牌排序
- r = Int(Rnd * (n - i + 1)) + i '获取随机位置
- t = Mid(s, r, 1) '取得结果s中随机位置r的字符存入临时变量t
- Mid(s, r, 1) = Mid(s, i, 1) '结果s中随机位置的字符和第i位置的字符进行交换
- Mid(s, i, 1) = t '结果s中第i位置写入临时变量中的值(即原来随机位置r的值)
- '这样就彻底完成了i位置字符和r位置字符的交换。
- Next
- RndNum = s '给函数赋值输出结果
- End Function
复制代码 在这里,直接用mid函数对字符串进行置换操作,计算速度要比数组更快!
|
评分
-
1
查看全部评分
-
|