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

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

DDD
DDDoriginal
2025-02-03 08:24:16736parcourir

How Can I Randomly Shuffle a List in C#?

randomiser une liste C #

Cet article explore des méthodes efficaces pour mélanger les éléments d'une liste générique (liste ) en C #. L'accent est mis sur l'algorithme de shuffle Fisher-Yates largement utilisé.

L'algorithme de shuffle Fisher-Yates

Le shuffle de Fisher-Yates est un algorithme éprouvé pour randomiser l'ordre de liste. Il est implémenté ici comme une méthode d'extension concise pour tout ilist :

<code class="language-csharp">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>

Ici, rng représente une instance de la classe Random.

Options de génération de nombres aléatoires

La classe standard System.Random est suffisante pour de nombreuses applications. Cependant, pour les situations exigeant une sécurité cryptographique plus élevée et une aléatoire améliorée, envisagez d'utiliser l'espace de noms System.Security.Cryptography:

<code class="language-csharp">public static void Shuffle<T>(this IList<T> list)
{
    using (var provider = new RNGCryptoServiceProvider())
    {
        int n = list.Count;
        while (n > 1)
        {
            byte[] box = new byte[1];
            do provider.GetBytes(box);
            while (!(box[0] < (byte)((n + 1) * (double.MaxValue / 256)))); //Ensure value within range
            int k = box[0] % (n + 1);
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }
}</code>

Cette version utilise RNGCryptoServiceProvider pour une aléatoire amélioré. Notez la vérification ajoutée pour garantir que le nombre aléatoire généré se situe dans la plage requise.

Exemple d'utilisation

Les deux méthodes sont utilisées de manière identique:

<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle(); </code>

Considérations de performance

tandis que System.Random offre de la vitesse, System.Security.Cryptography offre un aléatoire supérieur mais au prix des performances. Sélectionnez la méthode appropriée en fonction des besoins de votre application. Pour la plupart des mélanges généraux, System.Random est parfaitement adéquat.

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