<.> R.Next ()) `Une façon SART de mélanger une liste? "/> <code class=" language-csharp>var r = new Random(); var shuffled = ordered.OrderBy(x => r.Next()); <p> Cette méthode n'est pas une méthode de mélange idéale. Bien qu'il génère le seul nombre aléatoire pour chaque élément, il s'agit d'une opération O (n log n), et il existe un algorithme O (n) plus efficace. <strong> </strong> Principe de travail </p> <p> </p> Essentiellement, cette méthode est distribuée aux éléments au hasard et les a triés en fonction de ces nombres. Cela garantit que chaque élément apparaît dans différentes positions, mais l'emplacement est en fait déterminé par le nombre aléatoire généré. <p> <strong> Méthode alternative </strong> </p> <p> Il est recommandé d'utiliser l'algorithme Shuffle Fisher-Yates de la version Durstenfeld, qui échange directement des éléments. Peut être implémenté en utilisant de telles extensions comme celle-ci: </p> <p> <strong> Optimisation des performances </strong> </p> <p> Afin d'optimiser davantage les performances, les éléments peuvent être renvoyés immédiatement lors du mélange, réduisant ainsi les travaux inutiles: (ce code est exactement le même que le code précédent, répété) </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"><code class="language-csharp">public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng) { T[] elements = source.ToArray(); for (int i = elements.Length - 1; i >= 0; i--) { int swapIndex = rng.Next(i + 1); yield return elements[swapIndex]; elements[swapIndex] = elements[i]; } }</code>
Description importante
Doit utiliser la bonne instance aléatoire pour éviter de générer plusieurs fois la même séquence numérique et maintenir la sécurité des threads.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!