void Shuffle<T>(this IList<T> list)
{
int n = list.Count;
while (n > 1) {
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}int k = rng.Next(n + 1);
Сначала подумал: а зачем менять элемент с самим собой? А потом дошло: если 2 элемента, то без смены с самим собой элементы либо никогда не поменяются местами, либо будут меняться всегда (в зависимости от реализации)
если подразумевается конкурентный вызов, то рандом надо завернуть в ThreadLocal
всего лишь ради того чтобы одной из результирующих перестановок могла быть тождественная перестановка
а теперь самое главное, этот алгортим выдаёт равномерную случайность, потому что фактически делает следующее (не дословно): вытянули случайных элемент, положили первым вытянули из оставшихся случайны элементы, положил вторым и т.д.
сделай уже так, как было и забей
Обсуждают сегодня