Я согласен с ответом Макса. Если кто-то найдет это полезным, у меня есть пакет Nuget с именем RandomShuffler:
DataJuggler.RandomShuffler.Core (Dot Net Core)
DataJuggler.Core.RandomShuffler (. Net Framework)
Разница между Shuffler и Генератором случайных чисел заключается в том, что shuffler тянет все время, как колоду карт, и приводит к более равномерному распределению, где случайные числа могут выравниваться в течение нескольких миллионов лет или более.
Получите минимальные и максимальные границы вашего списка или массива
using DataJuggler.RandomShuffler.Core;
int min = 0;
int max = List.Count -1;
// Create a new instance of a 'RandomShuffler' object.
Shuffler = new RandomShuffler(min, max, 1, 3);
Это создаст список между вашими минимальными и максимальными значениями и 1 как третий параметр означает только 1 набор (без дубликатов).
Тогда каждый раз, когда вам нужно новое значение, просто вызывайте Shuffler.PullNextItem:
// pull the next White value
int index = Shuffler.PullNextItem();
var songToPlay = List[index]; // not sure what properties you need
Это автоматически перемешивает если у вас закончились, а также есть переопределения для карт.
Полный исходный код включен сюда, наряду с 30 другими бесплатными проектами:
https://github.com/DataJuggler?tab=repositories