VBA代码大全028:如何用vba生成随机的不重复整数?

如何用vba生成随机数?一文中我们介绍了用vba函数Rnd生成随机的0到1之间的不重复实数。

如果要生成区间范围更大的随机整数,比如生成4到10之间的随机整数,可以使用如下的代码:

Sub QQ1722187970()
    '生成一个随机数seed
    Randomize
    Dim oWK As Worksheet
    Set oWK = Sheet2
    With oWK
        .Cells.Clear
        For i = 1 To 5
            .Cells(i, 1) = Int(VBA.Rnd() * (10 - 4 + 1) + 4)
        Next i
    End With
End Sub

一般地,如果要生成[a,b]之间的随机整数,可以使用如下的公式:

Int(Rnd() * (b - a + 1) + a)

以上生成的随机整数会有重复值,如果要生成不重复的随机整数,可以使用如下的算法:

Sub GetRandNumber(ByVal lMin As Long, ByVal lMax As Long)
    '生成一个随机数seed
    Randomize
    Dim arr()
    Dim arrResult()
    ReDim arr(lMin To lMax)
    '先生成准备要取随机数的数组序列
    For i = lMin To lMax
        arr(i) = i
    Next i
    ReDim arrResult(lMin To lMax)
    lEnd = lMax
    For i = lMin To lMax
        '每次生成lMin到lEnd之间的随机整数
        j = Int(VBA.Rnd() * (lEnd - lMin + 1) + lMin)
        '把j位置的值取出放到随机数结果数组中
        arrResult(i) = arr(j)
        '将j位置的值与lEnd位置的值交换,保证下次不会再取到这个值
        arr(j) = arr(lEnd)
        '每次交换结束后,将lEnd减去1,保证不会再取到刚才取到的值。
        lEnd = lEnd - 1
    Next i
    Dim oWK As Worksheet
    Set oWK = Sheet8
    For i = lMin To lMax
        With oWK
            .Cells(i - lMin + 1, 1) = arrResult(i)
        End With
    Next i
End Sub
Sub QQ1722187970()
    Call GetRandNumber(0, 65535)
End Sub

其中GetRandNumber过程可以生成任意整数范围的随机不重复整数。

以下vba代码是一个通用的生成指定区间的随机不重复整数的自定义函数:

Function GetRandNumber(ByVal lMin As Long, ByVal lMax As Long)
    '生成一个随机数seed
    Randomize
    Dim arr()
    Dim arrResult()
    ReDim arr(lMin To lMax)
    '先生成准备要取随机数的数组序列
    For i = lMin To lMax
        arr(i) = i
    Next i
    ReDim arrResult(lMin To lMax)
    lEnd = lMax
    For i = lMin To lMax
        '每次生成lMin到lEnd之间的随机整数
        j = Int(VBA.Rnd() * (lEnd - lMin + 1) + lMin)
        '把j位置的值取出放到随机数结果数组中
        arrResult(i) = arr(j)
        '将j位置的值与lEnd位置的值交换,保证下次不会再取到这个值
        arr(j) = arr(lEnd)
        '每次交换结束后,将lEnd减去1,保证不会再取到刚才取到的值。
        lEnd = lEnd - 1
    Next i
   GetRandNumber = arrResult
End Function
       

发表评论