Comment mélanger une liste en C# : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment mélanger une liste en C# : du débutant à l'utilisateur averti

\n\n

Imaginez la situation : vous écrivez un programme pour un quiz, et les questions doivent apparaître dans un ordre aléatoire. Ou peut-être créez-vous une application pour un tirage au sort, où chaque participant reçoit un numéro aléatoire. Ou encore, vous voulez simplement que votre playlist musicale soit lue dans un ordre aléatoire, et non par ordre alphabétique. Dans tous ces cas, vous êtes confronté à la même tâche : comment mélanger une liste (List<T>) en C# ?

\n\n

Cette question est si populaire qu'elle a recueilli des milliers de vues et des centaines de réponses sur Stack Overflow. Et ce n'est pas surprenant – bien que la tâche semble simple, elle comporte des pièges. Dans cet article, nous allons examiner les trois méthodes les plus populaires pour randomiser une liste en C#, de la plus simple à la plus efficace. Vous apprendrez comment fonctionne chaque méthode, quand l'utiliser et, surtout, comment éviter les erreurs courantes.

\n\n

Pourquoi ne pas simplement trier aléatoirement ?

\n\n

La première idée qui vient à l'esprit d'un débutant : « Et si je triais la liste de manière aléatoire ? » Cela ressemble à ceci :

\n\n
List<string> myList = new List<string> { "Pomme", "Banane", "Cerise", "Melon" };\nRandom rnd = new Random();\nvar shuffled = myList.OrderBy(item => rnd.Next()).ToList();\n
\n\n

Le code fonctionne. Mais seulement en apparence. Le problème est que Random.Next() est appelé une seule fois pour chaque élément, et la comparaison est basée sur un seul nombre aléatoire. Cela ne garantit pas une distribution uniforme. De plus, cette approche peut entraîner un biais (bias) – certains éléments se retrouveront plus souvent au début ou à la fin de la liste. Pour des applications sérieuses (par exemple, pour des calculs scientifiques ou des jeux), cela est inacceptable.

\n\n

Mais ne rejetez pas cette méthode trop vite ! Pour des tâches simples où la précision n'est pas critique, elle peut très bien convenir. L'essentiel est de se souvenir de ses limites.

\n\n

Méthode n°1 : L'algorithme de Fisher-Yates (alias Knuth Shuffle) – l'étalon-or

\n\n

Si vous voulez faire les choses correctement du premier coup, utilisez l'algorithme de Fisher-Yates. C'est une méthode classique pour mélanger un tableau ou une liste, utilisée en programmation depuis 1938. Il fonctionne en temps O(n) et avec une mémoire supplémentaire O(1) – c'est-à-dire très rapidement et efficacement.

\n\n

Voici à quoi il ressemble en C# :

\n\n
using System;\nusing System.Collections.Generic;\n\npublic static class ListExtensions\n{\n    private static readonly Random rng = new Random();\n\n    public static void Shuffle<T>(this IList<T> list)\n    {\n        int n = list.Count;\n        while (n > 1)\n        {\n            n--;\n            int k = rng.Next(n + 1);\n            T value = list[k];\n            list[k] = list[n];\n            list[n] = value;\n        }\n    }\n}\n
\n\n

Comment cela fonctionne-t-il ?

\n
    \n
  • Nous commençons par le dernier élément de la liste.
  • \n
  • Nous choisissons un index aléatoire de 0 à la position actuelle.
  • \n
  • Nous échangeons l'élément à la position actuelle avec l'élément à l'index aléatoire.
  • \n
  • Nous passons à l'élément précédent et répétons jusqu'à atteindre le début.
  • \n
\n\n

Pourquoi est-ce le meilleur choix ?

\n
    \n
  • Uniformité : Chaque permutation des éléments est équiprobable.
  • \n
  • Efficacité : Un seul parcours de la liste, aucune opération superflue.
  • \n
  • Fonctionne sur place : Ne crée pas de nouvelles listes, économisant de la mémoire.
  • \n
  • Universalité : Fonctionne avec tout type de IList<T>, y compris les tableaux.
  • \n
\n\n

L'utilisation est simple :

\n\n
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\nnumbers.Shuffle();\n// Maintenant, numbers est dans un ordre aléatoire\n
\n\n

Notez : nous avons déclaré

Blogs

Book Recommendations