作者:绿色风
分类:
时间:2022-08-17
浏览:154
楼主 amulee |
Q:如何随机抽取N个数字组成M个不重复组合? A:比如从1-33个数中,随机抽取M个组合,每个组合包含N个不重复的数字。首先我们需要一个排序的代码。
- Sub QSort(ByRef InputArray As Variant, ByVal lb As Long, ByVal ub As Long)
- Dim Temp As Variant, hi As Integer, low As Integer, i As Integer
- If lb >= ub Then Exit Sub
- i = Int((ub + lb) / 2)
- Temp = InputArray(i)
- InputArray(i) = InputArray(lb)
- lo = lb
- hi = ub
- Do
- Do While InputArray(hi) >= Temp
- hi = hi - 1
- If hi <= lo Then Exit Do
- Loop
- If hi <= lo Then
- InputArray(lo) = Temp
- Exit Do
- End If
- InputArray(lo) = InputArray(hi)
- lo = lo + 1
- Do While InputArray(lo) < Temp
- lo = lo + 1
- If lo >= hi Then Exit Do
- Loop
- If lo >= hi Then
- lo = hi
- InputArray(hi) = Temp
- Exit Do
- End If
- InputArray(hi) = InputArray(lo)
- Loop
- QSort InputArray, lb, lo - 1
- QSort InputArray, lo + 1, ub
- End Sub
主代码如下:
- Sub MyRnd()
- Dim NumC%, NumP&
- Dim Arr
- Dim dAll As Object, dOne As Object
- Set dAll = CreateObject("SCRIPTING.DICTIONARY")
- Set dOne = CreateObject("SCRIPTING.DICTIONARY")
- NumC = Range("C1") 'N个数
- NumP = Range("C2") 'M个组合
- ReDim Arr(1 To NumP)
- For i = 1 To NumP
- Arr(i) = i
- Next i
- Range("D4:E1048576").ClearContents
- Range("D4").Resize(NumP, 1) = Application.Transpose(Arr)
- Do While dAll.Count < NumP
- dOne.RemoveAll
- Do While dOne.Count < NumC
- Randomize
- dOne(Format(Int(Rnd * 33 + 1), "00")) = 1
- Loop
- Erase Arr
- Arr = dOne.keys
- Call QSort(Arr, 0, NumC - 1)
- dAll(Join(Arr, " ")) = 1
- Loop
- Range("E4").Resize(NumP, 1) = Application.Transpose(dAll.keys)
- 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总版主之一