在如何用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


发表评论