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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-31 19:06:10809parcourir

Is `OrderBy(x => r.next ()) `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:

  • La création de plusieurs instances Random en succession rapide peut conduire à des séquences de nombres aléatoires similaires.
  • La classe 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!

Déclaration:
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