|
本帖最后由 百度不到去谷歌 于 2014-3-28 22:39 编辑
其实字典法也挺好的 对大多人来说 效率够了 当然数组法是最快的 可是很多高人们的代码 新手们看不懂的 更不会活用
我来做点体力活吧 我把洗牌算法打包一下 只要稍有基础的人就能直接使用了
打包后的函数 只需要传递区域或者单列二维数组,以及抽取个数N,返回结果为单列二维数组
使用者无需知道内部算法 相信稍有基础就可以自由使用了 有了这个函数 随意抽取N次就变得容易了 且完全不许知道内部算法
代码如下 后有测试工作表- '---------Sub 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 test()
- Dim i&
- [B3:IV65536] = ""
- For i = 1 To 5 '抽取5次依次从C3往右竖向输出,A列数数据源,B1数抽取个数
- [C3].Resize([B1]).Offset(0, i) = RndFromArr(Range([a1], [a65536].End(xlUp)), 10) '输出结果到工作表
- Next
- For i = 1 To 5 '[C1:P1]抽取10个,抽5次依次从R4横向往下输出
- [R3].Resize(1, [B1]).Offset(i, 0) = WorksheetFunction.Transpose(RndFromArr([C1:P1], 10)) '输出结果到工作表
- '注意横向输出时对函数结果转置
- Next
- End Sub
复制代码
随机抽取-通用工具.rar
(16.4 KB, 下载次数: 602)
|
评分
-
1
查看全部评分
-
|