У меня есть этот код, и он работает хорошо. Список ввода случайным образом перетасовывается очень хорошо.
Но у меня возникли небольшие проблемы с пониманием, ПОЧЕМУ он работает.
В частности, какую роль играет oBuffer
во всем этом? Почему строка в конце:
oBuffer(iRandom) = oBuffer(iIndex)
Я нахожу, что, когда я закомментирую это, я получаю дубликаты в списке вывода.
Я прошел через код, но Я все еще в растерянности. Что именно здесь происходит?
<Extension>
Public Iterator Function Randomize(Of T)(Instance As IEnumerable(Of T), Rng As Random) As IEnumerable(Of T)
Dim oBuffer As List(Of T)
Dim iRandom As Integer
Dim iIndex As Integer
Instance.ThrowIfNothing(NameOf(Instance))
Rng.ThrowIfNothing(NameOf(Rng))
oBuffer = Instance.ToList
For iIndex = 0 To oBuffer.Count - 1
iRandom = Rng.Next(iIndex, oBuffer.Count)
Yield oBuffer(iRandom)
oBuffer(iRandom) = oBuffer(iIndex)
Next
End Function