已知一个数组,将数组内容打乱并重新排序,可采用以下算法:
Sub 随机打乱排序数组()
'yngqq443440204@2024年4月1日09:52:06
Randomize ' 初始化随机数生成器
st = Timer
Dim arr(0 To 100000) As Variant
For i = 0 To 100000
arr(i) = i
Next
For i = 0 To UBound(arr)
j = i + Int((UBound(arr) - i + 1) * Rnd) '从第i个到最后一个数中随机选取一个数
temp = arr(i) ' 交换第i个数与选取的数
arr(i) = arr(j)
arr(j) = temp
Next i
ot = Timer
dt = ot - st
MsgBox dt
Stop
End Sub
由此可见,本案例排序10万个数,耗时不到0.02秒。
我们可将此算法设置为一个函数,重新排序数组直接调用函数即可:
Function 随机打乱排序数组(brr As Variant, number As Variant) As Variant
'yngqq443440114@1124年4月1日09:52:06
Randomize ' 初始化随机数生成器
' ReDim brr(0 To number) As Variant '数组内容全为空,不同于erase arr 删除数组
crr = brr '定义crr变量预防brr打乱导致arr也打乱
For i = 0 To UBound(crr)
j = i + Int((UBound(crr) - i + 1) * Rnd) '从第i个到最后一个数中随机选取一个数
temp = crr(i) ' 交换第i个数与选取的数
crr(i) = crr(j)
crr(j) = temp
Next i
随机打乱排序数组 = crr
End Function
Sub aa()
number = 9
Dim arr(): ReDim arr(0 To number) As Variant
For i = 0 To number
arr(i) = i
Next
result = 随机打乱排序数组(arr, number)
Stop
End Sub
由此可见,数组已打乱重新排序。