Fisher-Yates-Durstenfeld shuffle - проверенный метод, который легко реализовать.Вот метод расширения, который будет выполнять перемешивание на месте для любого IList<T>
.
(адаптация должна быть достаточно простой, если вы решите, что хотите оставить исходный список без изменений и вернуть новый, перемешанный).вместо списка или действуют на IEnumerable<T>
последовательностей , а-ля LINQ.)
var list = new List<string> { "the", "quick", "brown", "fox" };
list.ShuffleInPlace();
// ...
public static class ListExtensions
{
public static void ShuffleInPlace<T>(this IList<T> source)
{
source.ShuffleInPlace(new Random());
}
public static void ShuffleInPlace<T>(this IList<T> source, Random rng)
{
if (source == null) throw new ArgumentNullException("source");
if (rng == null) throw new ArgumentNullException("rng");
for (int i = 0; i < source.Count - 1; i++)
{
int j = rng.Next(i, source.Count);
T temp = source[j];
source[j] = source[i];
source[i] = temp;
}
}
}