Public Function CreateRandomArray(ArrayName() As Long, Min As Long, Max As Long, Duplicable As Boolean, BackProcess As Boolean)
'*******************************************************************
' 名 称: 随机数组生成函数
' 作 用: 生成随机数组
' 参 数 表: ArrayName() As Long 目标数组
' Min As Long 最小值
' Max As Long 最大值
' Duplicable As Boolean 可否重复
' BackProcess As Boolean 是否后台生成, 会影响速度
' 返 回 值: ArrayName() As Long
' 说 明: 仅限一维长整型数组, 数组元素编号从 1 开始
' 当生成无重复连续数组时(如生成一个含有1000个元素的数组而
' 数的范围为从1到1000), 速度会大幅度增加
'*******************************************************************
Dim i As Long
If Min >= Max Then Exit Function
Randomize Timer
If Duplicable = True Then
For i = 1 To UBound(ArrayName())
If BackProcess Then DoEvents
ArrayName(i) = Int((Rnd * (Max - Min + 1) + Min))
Next i
Else
If Max - Min + 1 = UBound(ArrayName()) Then
For i = 1 To UBound(ArrayName())
If BackProcess Then DoEvents
ArrayName(i) = Min + i - 1
Next i
Dim ii As Long
For i = 1 To Int(UBound(ArrayName()))
If BackProcess Then DoEvents
ii = Int(Rnd * (UBound(ArrayName())) + 1)
If ii <> i Then Swap ArrayName(i), ArrayName(ii)
Next i
Else
For i = 1 To UBound(ArrayName())
Do
ArrayName(i) = Int((Rnd * (Max - Min + 1) + Min))
Loop Until IfDuplicate(ArrayName(), i, BackProcess) = False
Next i
End If
End If
End Function
Private Function IfDuplicate(ArrayName() As Long, iCur As Long, BackProcess As Boolean) As Boolean
Dim ii As Long
For ii = 1 To iCur - 1
If BackProcess Then DoEvents
If ArrayName(ii) = ArrayName(iCur) Then
IfDuplicate = True
Exit Function
End If
Next ii
IfDuplicate = False
End Function
比如你要生成 1 到 1亿之间的不重复的5000万个数,可以用:
Dim a(1 To 50000000) As Long
CreateRandomArray a(), 1, 100000000&, False, False