ホームページ >バックエンド開発 >C++ >`orderby(x => r.next())`リストをシャッフルするスマートな方法ですか?

`orderby(x => r.next())`リストをシャッフルするスマートな方法ですか?

DDD
DDDオリジナル
2025-01-31 19:01:08566ブラウズ

r.next()) `リストをシャッフルするサートの方法は? " /> Is `OrderBy(x =>
</p> <<> <shuffleリストは賢明ですか? <p> <<>
<strong>シャッフルアルゴリズムについて議論する場合、次のコードを使用することをお勧めします。
<code>OrderBy(x => r.Next())</code>
</strong><估>評価</p><p>
</p>この方法は理想的なシャッフル方法ではありません。各要素の唯一の乱数を生成しますが、それはO(n log n)操作であり、より効果的なO(n)アルゴリズムがあります。 <pre class=<code class=" language-csharp>var r = new Random(); var shuffled = ordered.OrderBy(x => r.Next()); </p> <p>動作原則本質的に、この方法は要素にランダムに分散され、これらの数値に基づいてソートされます。これにより、各要素が異なる位置に表示されることが保証されますが、場所は実際に生成された乱数によって決定されます。 </p>代替方法<p></p> <p>要素を直接交換するDurstenFeldバージョンのFisher-Yates Shuffleアルゴリズムを使用することをお勧めします。このような拡張機能を使用して実装できます:<strong> </strong> </p>パフォーマンスの最適化<p></p> <p>パフォーマンスをさらに最適化するために、要素をシャッフルするときにすぐに要素を返すことができ、それにより不必要な作業が削減されます:(このコードは前のコードとまったく同じで、繰り返されます)<strong> </strong> </p>重要な説明<p></p> <pre class="brush:php;toolbar:false"><code class="language-csharp">public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng) { T[] elements = source.ToArray(); for (int i = elements.Length - 1; i >= 0; i--) { int swapIndex = rng.Next(i + 1); yield return elements[swapIndex]; elements[swapIndex] = elements[i]; } }</code>同じデジタルシーケンスを複数回生成しないようにして、適切なランダムインスタンスを使用して、スレッドセキュリティを維持する必要があります。

以上が`orderby(x => r.next())`リストをシャッフルするスマートな方法ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。