Maison > développement back-end > C++ > Est-ce que `OrderBy (x => r.next ())` est-il intelligent de mélanger une liste?

Est-ce que `OrderBy (x => r.next ())` est-il intelligent de mélanger une liste?

DDD
Libérer: 2025-01-31 19:01:08
original
564 Les gens l'ont consulté

<.> R.Next ()) `Une façon SART de mélanger une liste? "/> Is `OrderBy(x =>
</p> <<> est-ce que la liste <p> Shuffle est sage? <strong> <<>
<code>OrderBy(x => r.Next())</code> Lors de la discussion de l'algorithme Shuffle, certaines personnes recommandent d'utiliser le code suivant: </strong>
</p>
<p> <估> Évaluation </p> <pre class=<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>

Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal