Maison >développement back-end >C++ >Est-ce que `OrderBy (x => r.next ())` est-il un moyen efficace de mélanger une liste?
Utilisation de OrderBy(x => r.Next())
pour le mélange de liste: efficace ou non?
Certains programmeurs utilisent OrderBy(x => r.Next())
pour mélanger une liste, mais est-ce la meilleure approche? Examinons sa mécanique et son efficacité.
comment cela fonctionne
Cette méthode attribue un numéro aléatoire à chaque élément de la liste, puis trie la liste en fonction de ces nombres aléatoires. Cela réorganise efficacement la liste au hasard.
Problèmes de performances
L'inconvénient majeur est la performance. La méthode OrderBy
a une complexité temporelle de O (n log n), ce qui le rend considérablement plus lent que les autres algorithmes de mélange O (n) pour les listes plus grandes.
Une meilleure solution: le Fisher-Yates Shuffle
Une alternative beaucoup plus efficace est le shuffle Fisher-Yates (en particulier la variante de Durstenfeld), qui utilise un algorithme d'échange. Cet exemple montre une méthode réutilisable Shuffle
utilisant cette approche:
<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>
Cette version améliorée fournit des éléments alors qu'il mélange, optimisant l'utilisation et le traitement de la mémoire.
Notes importantes sur Random
N'oubliez pas ces points lorsque vous travaillez avec la classe Random
:
Random
en succession rapide peut conduire à des séquences de nombres aléatoires similaires. Random
n'est pas du thread-safe. Reportez-vous à l'article lié pour les meilleures pratiques sur l'utilisation de la classe Random
pour éviter ces pièges.
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!