无重复随机数算

1、无重复随机数算法一
这是最简单的算法,每产生一个随机数,就和已有的比较,如果已经存在,则重新产生。比较适合从一个大范围里面抽出一小部分数据,比如,从题库中抽取试题。
Public SubRndNumberNoRepeat1()
    Dim RndNumber, temp(20), i, k, Maxrec AsInteger
    Randomize (Timer)           '初始化随机数生成器
    Maxrec = 100      ' 从A21开始输出随机数
    k = 0
     Do While k < 20
        RndNumber = Int(Maxrec * Rnd) + 1
        temp(k) = RndNumber
        Cells(k + 21, 1) = RndNumber
        For i = 0 To k - 1
            If temp(i) = RndNumber Then ExitFor
        Next i
            If i = k Then k = i + 1 'MsgBox"随机数:" & RndNumber
    Loop
End Sub
2、无重复随机数算法二
这个算法比较巧妙,需要细细体会,才能知道真谛。这个算法不会重复产生随机数,但需要一个占位数组。比较适合输出范围之内所有数值的场合,比如,随机发牌。
SubRndNumberNoRepeat2()
    Dim RndNumber, TempArray(99), i As Integer
    Randomize (Timer)           '初始化随机数生成器
    For i = 0 To 99            '产生包含1-100的不重复的随机数列
        TempArray(i) = i
    Next i
    For i = 99 To 80 Step -1
        RndNumber = Int(i * Rnd)
       Cells(120 - i, 1) = TempArray(RndNumber) + 1 '从A21开始输出这些数字
        TempArray(RndNumber) = TempArray(i)
    Next i
End Sub
3、无重复随机数算法三
这个算法使用字典对象完成去重复,和第一个算法差不多,但程序看上去简洁一点,嗯,起码新颖一点。
SubRndNumberNoRepeat3()
    Dim d As Object   'New Dictionary
    Dim s As Integer
    Randomize (Timer)           '初始化随机数生成器
    Set d= CreateObject("Scripting.Dictionary")
    Do Until d.Count = 20
        s = Int(Rnd * 100 + 1)
        d(s) = ""
    Loop
    [a21].Resize(d.Count, 1) =Application.Transpose(d.Keys)
End Sub
本博客所有文章如无特别注明均为原创。作者:果果 ,复制或转载请以超链接形式注明转自 冰寒吧 。
原文地址《无重复随机数算》

相关推荐

网友评论(0)