Ответ 1
Fisher-Yates Shuffle или как его называют также, Knuth shuffle.
Возможный дубликат:
Рандомизировать список <T> в С#
У меня есть список, который содержит много тысяч FilePath для местоположения аудиофайлов, и задавался вопросом, какой из них будет наиболее эффективным способом "перетасовать" список?
Любая помощь приветствуется:)
Спасибо
Fisher-Yates Shuffle или как его называют также, Knuth shuffle.
Вот простая (но эффективная) реализация Fischer-Yates/Knuth shuffle:
Random rnd = new Random();
for (int i = files.Length; i > 1; i--) {
int pos = rnd.Next(i);
var x = files[i - 1];
files[i - 1] = files[pos];
files[pos] = x;
}
Или небольшое изменение:
Random rnd = new Random();
for (int i = 1; i < files.Length; i++) {
int pos = rnd.Next(i + 1);
var x = files[i];
files[i] = files[pos];
files[pos] = x;
}
Поскольку это операция O (n), это самый эффективный способ перетасовки списка. Поскольку все элементы в списке должны иметь возможность перемещаться, невозможно перетасовать список более эффективно, чем O (n).
Я сделал небольшой тест производительности, перетасовывая миллион элементов в тысячу раз каждый, используя этот метод и принятый в настоящее время ответ (LINQ OrderBy), и это примерно в 15 раз (!) быстрее.
myList.OrderBy(Guid.NewGuid())
Я добавил решение Jon Skeet из этого вопроса в мою библиотеку расширений. Я реализовал методы, которые берут генератор случайных чисел и создают один, используя реализацию по умолчанию (Random).