Dans divers scénarios de programmation, l'ordre des éléments dans des listes génériques aléatoires est une opération courante. Cet article présentera la meilleure façon d'atteindre cet objectif en C #.
La méthode la plus recommandée consiste à utiliser l'algorithme Shuffle Fisher-Yates, qui est un algorithme de randomisation de liste bien connu. Pour utiliser cette méthode, veuillez définir une méthode d'extension, comme indiqué ci-dessous:
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; } }
<方法> comment utiliser:
List<Product> products = GetProducts(); products.Shuffle();
System.Random
System.Security.Cryptography
Considérations de sécurité des threads
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)n / 256))); //确保生成的随机数在范围内 int k = (int)(box[0] * (n / 256.0)); T value = list[k]; list[k] = list[n - 1]; list[n - 1] = value; n--; } } }
ThreadSafeRandom
La méthode d'extension mise à jour
public static class ThreadSafeRandom { [ThreadStatic] private static Random Local; public static Random ThisThreadsRandom { get { return Local ?? (Local = new Random(unchecked(Environment.TickCount * 31 + Thread.CurrentThread.ManagedThreadId))); } } }
<<>
public static void Shuffle<T>(this IList<T> list) { int n = list.Count; while (n > 1) { n--; int k = ThreadSafeRandom.ThisThreadsRandom.Next(n + 1); T value = list[k]; list[k] = list[n]; list[n] = value; } }
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!