VBA中实现对数组随机排序

分类:代码, 博客 标签:

在许多智能算法中,需要对群体进行随机排序(或称为混洗)。假定一个数组中保存了各个个体的索引,则对此索引数组进行随机排序就相当于对群体进行了随机排序。这里提供了两个函数ShuffleArray与ShuffleArrayInPlace,前者会返回排序后的数组,而后者对传入的数组进行随机排序,更新的是传入的数组,不返回任何数值。具体代码如下:

Function ShuffleArray(InArray() As Variant) As Variant()
''''''''''''''''''''''''''''''''''''''
' ShuffleArray
' This function returns the values of InArray in random order. 
' The original InArray is not modified.
''''''''''''''''''''''''''''''''''''''
    Dim N As Long
    Dim L As Long
    Dim Temp As Variant
    Dim J As Long
    Dim Arr() As Variant
    
    
    Randomize
    L = UBound(InArray) - LBound(InArray) + 1
    ReDim Arr(LBound(InArray) To UBound(InArray))
    For N = LBound(InArray) To UBound(InArray)
        Arr(N) = InArray(N)
    Next N
    For N = LBound(InArray) To UBound(InArray)
        J = Int((UBound(InArray) - LBound(InArray) + 1) * Rnd + LBound(InArray))
        If N <> J Then
            Temp = Arr(N)
            Arr(N) = Arr(J)
            Arr(J) = Temp
        End If
    Next N
    ShuffleArray = Arr
End Function

Sub ShuffleArrayInPlace(InArray() As Variant)
''''''''''''''''''''''''''''''''''''''
' ShuffleArrayInPlace
' This shuffles InArray to random order, randomized in place.
''''''''''''''''''''''''''''''''''''''
    Dim N As Long
    Dim L As Long
    Dim Temp As Variant
    Dim J As Long
   
    Randomize
    L = UBound(InArray) - LBound(InArray) + 1
    For N = LBound(InArray) To UBound(InArray)
        J = Int((UBound(InArray) - LBound(InArray) + 1) * Rnd + LBound(InArray))
        If N <> J Then
            Temp = InArray(N)
            InArray(N) = InArray(J)
            InArray(J) = Temp
        End If
    Next N
End Sub


分类:代码, 博客 标签:

发表评论

You must be logged in to post a comment.