|
发表于 2014-5-27 13:11
|
显示全部楼层
本楼为最佳答案
- Sub DataRnd()
- Dim arr, i&, j&, k&, m&, n&, i1&, j1&, ii&, jj&, r&, s&, t, rw&, cl&, cnt&, tms#
-
- arr = [a1].CurrentRegion '原始数据读入数组arr
- rw = UBound(arr): cl = UBound(arr, 2): s = rw * cl
-
- cnt = InputBox("待抽取个数 Set Total Amount:", "", s): If cnt = 0 Then Exit Sub
- n = InputBox("设置分列列数 Set Columns n=:", "", 3): If n = 0 Then Exit Sub
- m = (cnt - 1) \ n '计算最大行数
- ReDim brr(m, n - 1) '定义输出结果的数组brr (注意下标是从0开始)
-
- tms = Timer
- Randomize
- For i = 0 To m '遍历行 (行优先)
- For j = 0 To n - 1 '遍历列
- r = Int(Rnd * (s - k)) + k '计算不重复随机位置 (按序号)
- ii = r \ cl + 1: jj = r Mod cl + 1 '换算为数组arr的实际对应坐标
- t = arr(ii, jj): arr(ii, jj) = arr(i1 + 1, j1 + 1): arr(i1 + 1, j1 + 1) = t '数组交换算法保证随机
- brr(i, j) = t: k = k + 1: If k = cnt Then Exit For '随机结果写入数组brr 直到最后一个时退出
- j1 = j1 + 1: If j1 = cl Then j1 = 0: i1 = i1 + 1 '计算数组arr中下一个起始位置
- Next
- Next
- MsgBox "数组计算耗时:" & Format(Timer - tms, " 0.000s"): tms = Timer
-
- [a1].Offset(, cl + 2).CurrentRegion = ""
- [a1].Offset(, cl + 2).Resize(m + 1, n) = brr
- MsgBox "输出结果耗时" & Format(Timer - tms, " 0.000s")
- End Sub
复制代码 附件中代码无注释,无中文提示。
|
评分
-
查看全部评分
|