Maison > développement back-end > C++ > Comment générer efficacement des sous-collections aléatoires à l'aide de LINQ ?

Comment générer efficacement des sous-collections aléatoires à l'aide de LINQ ?

Mary-Kate Olsen
Libérer: 2025-01-01 03:54:09
original
978 Les gens l'ont consulté

How to Efficiently Generate Random Subcollections Using LINQ?

Requête LINQ optimale pour les sous-collections aléatoires : Shuffle

La génération d'une collection mélangée aléatoirement d'un nombre spécifique à partir d'une collection plus grande peut être réalisée de plusieurs manières en utilisant LINQ.

Une approche efficace consiste à utiliser l'algorithme de lecture aléatoire Fisher-Yates-Durstenfeld, qui peut être implémenté en tant que méthode d'extension dans LINQ :

public static class EnumerableExtensions
{
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));
        if (rng == null) throw new ArgumentNullException(nameof(rng));

        return source.ShuffleIterator(rng);
    }

    private static IEnumerable<T> ShuffleIterator<T>(
        this IEnumerable<T> source, Random rng)
    {
        var buffer = source.ToList();
        for (int i = 0; i < buffer.Count; i++)
        {
            int j = rng.Next(i, buffer.Count);
            yield return buffer[j];

            buffer[j] = buffer[i];
        }
    }
}
Copier après la connexion

Pour récupérer une sous-collection aléatoire de nombre 'n' à partir d'une collection d'éléments 'N', où n <= N, appliquez simplement Shuffle() méthode d'extension suivie de Take(n):

var randomItems = yourCollection.Shuffle().Take(n);
Copier après la connexion

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