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]; } }
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);
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!