|
|
'从size里面随机挑选num的不重复的选择!
'生成的结果保存在data数组里面,分别对应生成的索引
'比方你想从0-99里面随机抽选出10个不重复的数,对应的调用为:
'Dim data() as Long,i as Long
'RndChoose 100,10,data()
'For i=0 to 9
' Debug.Print i
'Next
'有没有谁有更好的算法呢?在速度和内存上要兼顾!!!敬请回贴
'By Boywhp
Private Sub RndChoose(size As Long, num As Long, data() As Long)
Dim i As Long, j As Long, k As Long, l As Long, m As Long
Debug.Assert size > num
ReDim data(2 * num - 1)
data(0) = Rnd * size - 0.5
For i = 1 To num - 1
j = Rnd * (size - i) - 0.5
If j < data(0) Then’插入到首位置
CopyMemory data(num), data(0), i * LenB(data(0))
CopyMemory data(1), data(num), i * LenB(data(0))
data(0) = j
ElseIf j > data(i - 1) Then’插入到末尾
data(i) = j + i
Else '计算插入位置
l = data(0) - 1
For k = 1 To i - 1
l = l + data(k) - data(k - 1) - 1
If l >= j Then
m = data(k) + j - l - 1
CopyMemory data(num), data(k), (i - k) * LenB(data(0))
CopyMemory data(k + 1), data(num), (i - k) * LenB(data(0))
data(k) = m
Exit For
End If
Next
If l < j Then’插入到末尾
data(i) = j + i
End If
End If
Next
End Sub |
|