Maison > développement back-end > C++ > Comment puis-je mélanger efficacement une liste en C #?

Comment puis-je mélanger efficacement une liste en C #?

DDD
Libérer: 2025-02-03 08:28:09
original
653 Les gens l'ont consulté

How Can I Efficiently Shuffle a List in C#?

Tri efficace et aléatoire C # Liste

En C #, le tri aléatoire des listes génériques est une tâche courante dans le développement de logiciels. Par exemple, dans les applications de loterie, vous devrez peut-être être trié au hasard sur des ensembles numériques limités.

Best Practice:

En C #, la méthode la plus efficace pour les listes de réglages aléatoires est d'utiliser la méthode d'expansion basée sur l'algorithme de mélange Fisher-Yates. La méthode fournie ci-dessous assure des éléments de liste de remaniement efficaces et vraiment aléatoires:

comment utiliser:

<code class="language-csharp">private static Random rng = new Random();

public static void Shuffle<T>(this IList<T> list)
{
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}</code>
Copier après la connexion

Cette méthode d'extension est simple. Considérez l'exemple suivant: Le choix du générateur de nombres aléatoires:

Bien que le code ci-dessus utilise la méthode
<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle();</code>
Copier après la connexion
, il doit admettre ses limitations potentielles dans la random. Si votre application nécessite un aléatoire de meilleure qualité, vous pouvez utiliser le générateur de nombres aléatoires fourni dans

, comme indiqué ci-dessous:

Sécurité du thread:

System.Random System.Security.Cryptography Afin d'assurer la randomisation des threads en toute sécurité, les méthodes d'expansion modifiées suivantes doivent être prises en compte:

<code class="language-csharp">using System.Security.Cryptography;
...
public static void Shuffle<T>(this IList<T> list)
{
    using (RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider())
    {
        int n = list.Count;
        while (n > 1)
        {
            byte[] box = new byte[1];
            do provider.GetBytes(box);
            while (!(box[0] < (byte)((double)byte.MaxValue * (double)n / (double)uint.MaxValue)));
            int k = (int)(box[0] / ((double)byte.MaxValue / n));
            T value = list[k];
            list[k] = list[n - 1];
            list[n - 1] = value;
        }
    }
}</code>
Copier après la connexion

parmi eux défini comme:

Grâce à ces méthodes, vous pouvez choisir la méthode de tri aléatoire la plus appropriée en fonction de vos besoins. Veuillez noter que l'importance de lors de l'utilisation de

pour assurer la version correcte des ressources.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal