さまざまなプログラミングシナリオでは、ランダムに一般的なリストの要素の順序は一般的な操作です。この記事では、C#でこの目標を達成するための最良の方法を紹介します。
最も推奨される方法は、Fisher-Yatesシャッフルアルゴリズムを使用することです。これは、よく知られているリストランダム化アルゴリズムです。この方法を使用するには、以下に示すように拡張メソッドを定義してください。
<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>の使用方法:
スレッドセキュリティ上の考慮事項
この復活した答えは、クレアレラーランプレーニングを提供し、コードの読みやすさ(特にrngcryprovider examph)を改善し、安全上の懸念をより効果的に扱います。<code class="language-csharp">List<Product> products = GetProducts();
products.Shuffle();</code>
高効率ですが、実際のランダムシーケンスを生成できない場合があります。ランダム性を向上させるために、ライブラリはより信頼できるオプションを提供します:
System.Random
System.Security.Cryptography
マルチスレッドアプリケーションでシャッフル拡張方法を使用する場合、スレッドセキュリティを確保する必要があります。簡単な解決策は、<code class="language-csharp">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--;
}
}
}</code>
の新しい例を作成することです。
更新された拡張方法ThreadSafeRandom
スレッドセキュリティメソッドをシャッフルエクステンション方法に統合します:<code class="language-csharp">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))); }
}
}</code>
以上がC#で一般的なリストを効率的にシャッフルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。