不重复随机数
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