Maison > développement back-end > C++ > Comment puis-je mélanger aléatoirement un sous-ensemble d'une collection à l'aide de LINQ ?

Comment puis-je mélanger aléatoirement un sous-ensemble d'une collection à l'aide de LINQ ?

DDD
Libérer: 2025-01-01 08:05:09
original
208 Les gens l'ont consulté

How Can I Randomly Shuffle a Subset of a Collection Using LINQ?

Mélanger aléatoirement une sous-collection dans LINQ à l'aide de Fisher-Yates-Durstenfeld

Lorsque vous traitez de grands ensembles de données, obtenir une collection mélangée aléatoirement d'une taille spécifique à partir d'une collection donnée devient crucial. Cela se produit généralement dans les scénarios impliquant une sélection ou un échantillonnage randomisé. Explorons une solution optimale basée sur LINQ à ce problème.

L'algorithme de lecture aléatoire Fisher-Yates-Durstenfeld offre une approche efficace et fiable de la lecture aléatoire. Dans ce contexte, le but est de produire un sous-ensemble aléatoire de taille 'n' à partir d'une collection de 'N' éléments, où 'n' est inférieur ou égal à 'N'.

Pour implémenter cet algorithme en utilisant LINQ, nous pouvons exploiter une méthode d'extension qui encapsule l'opération de lecture aléatoire. L'extrait de code suivant fournit une implémentation complète :

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

Dans cette implémentation, la méthode d'extension Shuffle accepte une source de séquence d'entrée et une instance de Random nommée rng. Il crée une liste tampon à partir de la séquence d'entrée et la parcourt, en sélectionnant des éléments de manière aléatoire. Les éléments sélectionnés sont renvoyés sous forme d'itérateur, en préservant l'ordre aléatoire.

Pour utiliser cette méthode d'extension, ajoutez simplement .Shuffle() à la séquence d'entrée suivi de .Take(n), où n représente la taille souhaitée. de la sous-collection mélangée. Par exemple :

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

Cette approche basée sur Linq fournit une solution concise et efficace pour mélanger et obtenir de manière aléatoire une sous-collection de n'importe quelle taille à partir d'une collection donnée. Il est particulièrement adapté aux scénarios où une véritable randomisation est requise.

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