在如何用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
发表评论