|
本帖最后由 百度不到去谷歌 于 2014-4-20 10:50 编辑
以前写好的有通用乱序函数 这就简单了- '---------Function RndFromArr---原作:洗牌算法---整理:百度不到去谷歌 2014/3/28---------------------------
- '功能 : 从单列二维数组或单元格区域中不重复随机抽取N个数,返回抽取的的二维数组(单列)
- '变量 : RngArr 单元格区域/二维单列数组
- ' N 要抽取的个数
- '---------------------------------------------------------------------------------------------------------
- Function RndFromArr(RngArr, n&)
- Dim M&, arr(), rng As Range, r&, i&, t
- If TypeName(RngArr) = "Range" Then '接受单元格区域,可多行多列,所有传入数据转为数组
- ReDim arr(1 To RngArr.Count, 1)
- For Each rng In RngArr
- M = M + 1: arr(M, 1) = rng
- Next
- Else
- arr = RngArr
- End If
- ReDim brr(1 To n, 1 To 1) '定义结果数组
- M = UBound(arr) '
- If n > M Then RndFromArr = "Err": Exit Function
- Randomize '随机种子初始化 以保证每次得到不同的随机序列
- For i = 1 To n '遍历提取n个数据
- r = Int(Rnd * (M - i + 1)) + i '从剩余数据中得到随机位置r (注意里面剩余数计算用m 不是n)
- t = arr(r, 1): arr(r, 1) = arr(i, 1): brr(i, 1) = t
- '用临时变量t进行随机位置和当前位置的交换 保证得到随机不重复乱序结果
- Next
- RndFromArr = brr
- End Function
- Sub 按钮1_Click()
- Dim n&, i&, j&
- n = [E3]: i = [E4]
- For j = 1 To n Step i
- [b1].Offset(j).Resize(i) = RndFromArr([A1].Offset(j).Resize(i), i)
- Next
- End Sub
复制代码 |
|