我一直在寻找彩票号码生成器,发现了这一点:
Sub LotteyCode()
Dim Rng As Range
Dim WorkRng As Range
Dim xNumbers(49) As Integer
On Error Resume Next
For xy = 1 To 10000
Set WorkRng = Range("A" & xy)
For xIndex = 1 To 49
xNumbers(xIndex) = xIndex
Next
For xIndex = 1 To 6
xNum = 1 + Application.Round(Rnd * (49 - xIndex), 0)
WorkRng.Offset(0, xIndex - 1).Value = xNumbers(xNum)
xNumbers(xNum) = xNumbers(50 - xIndex)
Next
Next xy
End Sub
我通读了代码,为了我的一生,我不明白这不会产生重复的数字(代码中没有解释为什么这样写)...
我进行了10000次迭代(如“ xy = 1 To 10000”所示),以确保它确实给出了唯一的数字。
如果任何人都可以对此有所了解,我将非常感激!
答案 0 :(得分:2)
一开始我实际上也有些困惑,但是在我浏览它之后,我注意到使它起作用的是下面的第一行和第三行:
xNum = 1 + Application.Round(Rnd * (49 - xIndex), 0)
WorkRng.Offset(0, xIndex - 1).Value = xNumbers(xNum)
xNumbers(xNum) = xNumbers(50 - xIndex)
第一行从数组中选择一个随机索引,但是在每次迭代中,从数组末尾排除一个额外的索引。
第二行(在乐透意义上)“拾取”数组中该索引处的数字。
第三行将所选索引处的值替换为,以确保该迭代中选择的数字不再被选择。