为什么这段代码没有重复?

时间:2019-09-14 19:39:53

标签: vba random

我一直在寻找彩票号码生成器,发现了这一点:

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”所示),以确保它确实给出了唯一的数字。

如果任何人都可以对此有所了解,我将非常感激!

1 个答案:

答案 0 :(得分:2)

一开始我实际上也有些困惑,但是在我浏览它之后,我注意到使它起作用的是下面的第一行和第三行:

xNum = 1 + Application.Round(Rnd * (49 - xIndex), 0)
WorkRng.Offset(0, xIndex - 1).Value = xNumbers(xNum)
xNumbers(xNum) = xNumbers(50 - xIndex)

第一行从数组中选择一个随机索引,但是在每次迭代中,从数组末尾排除一个额外的索引

第二行(在乐透意义上)“拾取”数组中该索引处的数字。

第三行将所选索引处的值替换为,以确保该迭代中选择的数字不再被选择。