不重复随机数

1、不重复随机数1

生产[lowerbound,upperbound]的随机数,核心代码:Int((upperbound - lowerbound + 1) * Rnd + lowerbound),示例代码如下:

Sub RndNumNoRepeat1()
    Dim dic
    Dim i&
    Set dic = CreateObject("scripting.dictionary")
    Randomize (Timer)
    Do Until dic.Count = 20
        i = Int((100 - 50 + 1) * Rnd + 50)
        dic(i) = ""
    Loop
    [a2].Resize(dic.Count, 1) = Application.Transpose(dic.keys)
End Sub

2、不重复随机数2

这个算法比较巧妙,需要细细体会,才能知道真谛。这个算法不会重复产生随机数,但需要一个占位数组。

比较适合输出范围之内所有数值的场合,比如,随机发牌,示例代码如下(生成20个1-100的不重复随机数)

Sub RndNumNoRepeat2()
    Dim RndNum&, i&
    Dim TempArr, arr
    Randomize (Timer)           '初始化随机数生成器
    ReDim TempArr(0 To 99)      '产生一个随机数列
    ReDim arr(0 To 19, 0 To 0)
    For i = 0 To 99
        TempArr(i) = i
    Next
    For i = 99 To 80 Step -1
        RndNum = Int(i * Rnd)
        arr(99 - i, 0) = TempArr(RndNum) + 1
        TempArr(RndNum) = TempArr(i)
    Next
    [c2].Resize(UBound(arr) + 1, 1) = arr
End Sub

3、不重复随机数3

每产生一个随机数,就和已有的比较,如果已经存在,则重新产生比较适合从一个大范围里面抽出一小部分数据。

比如,从题库中抽取试题,示例代码(生成20个1-100的不重复随机数)

Sub RndNumNoRepeat3()
    Dim RndNum&, i&, j&, k&
    Dim TempArr, arr
    Randomize (Timer)           '初始化随机数生成器
    ReDim TempArr(0 To 19)
    ReDim arr(0 To 19, 0 To 0)
    j = 100
    '
    k = 0
    Do While k < 20
        RndNum = Int(j * Rnd) + 1
        TempArr(k) = RndNum
        arr(k, 0) = RndNum
        For i = 0 To k - 1
            If TempArr(i) = RndNum Then Exit For
        Next
        If i = k Then k = i + 1
    Loop
    [e2].Resize(UBound(arr) + 1, 1) = arr
End Sub
原文地址:https://www.cnblogs.com/Stefan-Gao/p/14300776.html