Mélanger une List
Mélangez n’importe quelle (I)List avec une méthode d’extension basée sur le mélange de Fisher-Yates :
private static Random rng = new Random();
public static 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;
}
}
Utilisation :
List<Product> products = GetProducts();
products.Shuffle();
Le code ci-dessus utilise la méthode System.Random souvent critiquée pour sélectionner les candidats à l’échange. C’est rapide mais pas aussi aléatoire que ça devrait l’être. Si vous avez besoin d’une meilleure qualité d’aléatoire dans vos mélanges, utilisez le générateur de nombres aléatoires dans System.Security.Cryptography comme ceci :
using System.Security.Cryptography;
...
public static void Shuffle<T>(this IList<T> list)
{
RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
int n = list.Count;
while (n > 1)
{
byte[] box = new byte[1];
do provider.GetBytes(box);
while (!(box[0] < n * (Byte.MaxValue / n)));
int k = (box[0] % n);
n--;
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
Une comparaison simple est disponible sur ce blog (WayBack Machine).
Edit : Depuis que j’ai écrit cette réponse il y a quelques années, beaucoup de personnes ont commenté ou m’ont écrit pour signaler la grosse erreur ridicule dans ma comparaison. Ils ont bien sûr raison. Il n’y a rien de mal avec System.Random s’il est utilisé comme prévu. Dans mon premier exemple ci-dessus, j’instancie la variable rng à l’intérieur de la méthode Shuffle, ce qui pose problème si la méthode est appelée de manière répétée. Ci-dessous se trouve un exemple complet corrigé basé sur un commentaire vraiment utile reçu aujourd’hui de @weston ici sur SO.
Program.cs :
using System;
using Sy
*(Réponse tronquée)*