No seu código, você gera um índice aleatório com:
sampling = Int((interval - Lower + 1) * Rnd + Lower)
isso funciona, mas permite repetições aleatórias. Outra maneira é
- cria uma matriz fixa de índices
- misture os índices
- use os índices
Isso garante que não se repitam (porque não há repetições nos índices)
Aqui está um exemplo de ambos os tipos de amostragem aleatória:
Public ary(1 To 10) As String
Sub MAIN()
ary(1) = "Cordelia"
ary(2) = "Ophelia"
ary(3) = "Bianca"
ary(4) = "Cressida"
ary(5) = "Desdemona"
ary(6) = "Juliet"
ary(7) = "Portia"
ary(8) = "Rosalind"
ary(9) = "Mab"
ary(10) = "Belinda"
Call MightRepeat
Call WillNotRepeat
End Sub
Sub MightRepeat()
Randomize
Lower = 1
interval = 10
For iTimes = 1 To 3
sampling = Int((interval - Lower) * Rnd + Lower)
MsgBox iTimes & vbCrLf & sampling & vbCrLf & ary(sampling)
Next iTimes
End Sub
Sub WillNotRepeat()
Dim ndex(1 To 10)
For i = 1 To 10
ndex(i) = i
Next i
Call Shuffle(ndex)
For i = 1 To 3
MsgBox i & vbCrLf & ary(ndex(i))
Next i
End Sub
Sub Shuffle(InOut() As Variant)
Dim HowMany As Long, i As Long, J As Long
Dim tempF As Double, temp As Variant
Hi = UBound(InOut)
Low = LBound(InOut)
ReDim Helper(Low To Hi) As Double
Randomize
For i = Low To Hi
Helper(i) = Rnd
Next i
J = (Hi - Low + 1) \ 2
Do While J > 0
For i = Low To Hi - J
If Helper(i) > Helper(i + J) Then
tempF = Helper(i)
Helper(i) = Helper(i + J)
Helper(i + J) = tempF
temp = InOut(i)
InOut(i) = InOut(i + J)
InOut(i + J) = temp
End If
Next i
For i = Hi - J To Low Step -1
If Helper(i) > Helper(i + J) Then
tempF = Helper(i)
Helper(i) = Helper(i + J)
Helper(i + J) = tempF
temp = InOut(i)
InOut(i) = InOut(i + J)
InOut(i + J) = temp
End If
Next i
J = J \ 2
Loop
End Sub