ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何随机抽取N个数字组成M个不重复组合?

如何随机抽取N个数字组成M个不重复组合?

作者:绿色风 分类: 时间:2022-08-17 浏览:154
楼主
amulee
Q:如何随机抽取N个数字组成M个不重复组合?
A:比如从1-33个数中,随机抽取M个组合,每个组合包含N个不重复的数字。首先我们需要一个排序的代码。
  1. Sub QSort(ByRef InputArray As Variant, ByVal lb As Long, ByVal ub As Long)
  2.     Dim Temp As Variant, hi As Integer, low As Integer, i As Integer
  3.     If lb >= ub Then Exit Sub
  4.     i = Int((ub + lb) / 2)
  5.     Temp = InputArray(i)
  6.     InputArray(i) = InputArray(lb)
  7.     lo = lb
  8.     hi = ub
  9.     Do
  10.         Do While InputArray(hi) >= Temp
  11.             hi = hi - 1
  12.             If hi <= lo Then Exit Do
  13.         Loop
  14.         If hi <= lo Then
  15.             InputArray(lo) = Temp
  16.             Exit Do
  17.         End If
  18.         InputArray(lo) = InputArray(hi)
  19.         lo = lo + 1
  20.         Do While InputArray(lo) < Temp
  21.             lo = lo + 1
  22.             If lo >= hi Then Exit Do
  23.         Loop
  24.         If lo >= hi Then
  25.             lo = hi
  26.             InputArray(hi) = Temp
  27.             Exit Do
  28.         End If
  29.         InputArray(hi) = InputArray(lo)
  30.     Loop
  31.     QSort InputArray, lb, lo - 1
  32.     QSort InputArray, lo + 1, ub
  33. End Sub

主代码如下:
  1. Sub MyRnd()
  2.     Dim NumC%, NumP&
  3.     Dim Arr
  4.     Dim dAll As Object, dOne As Object
  5.     Set dAll = CreateObject("SCRIPTING.DICTIONARY")
  6.     Set dOne = CreateObject("SCRIPTING.DICTIONARY")
  7.     NumC = Range("C1")  'N个数
  8.     NumP = Range("C2")  'M个组合
  9.     ReDim Arr(1 To NumP)
  10.     For i = 1 To NumP
  11.         Arr(i) = i
  12.     Next i
  13.     Range("D4:E1048576").ClearContents
  14.     Range("D4").Resize(NumP, 1) = Application.Transpose(Arr)
  15.     Do While dAll.Count < NumP
  16.         dOne.RemoveAll
  17.         Do While dOne.Count < NumC
  18.             Randomize
  19.             dOne(Format(Int(Rnd * 33 + 1), "00")) = 1
  20.         Loop
  21.         Erase Arr
  22.         Arr = dOne.keys
  23.         Call QSort(Arr, 0, NumC - 1)
  24.         dAll(Join(Arr, " ")) = 1
  25.     Loop
  26.     Range("E4").Resize(NumP, 1) = Application.Transpose(dAll.keys)
  27. End Sub


请参考附件

随机抽取N个数字组成M个不重复组合.rar
2楼
军_龙
谢谢啦!
3楼
森淼
如果不排序,应该怎么做?
4楼
森淼
从(1-60)的整数中取三个不重复的整数,不排序,怎样实现呢?
5楼
icenotcool

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap