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

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

DDD
リリース: 2025-01-31 19:01:08
オリジナル
626 人が閲覧しました

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)アルゴリズムがあります。 <div class=

var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());
ログイン後にコピー

<原>動作原則< 本質的に、この方法は要素にランダムに分散され、これらの数値に基づいてソートされます。これにより、各要素が異なる位置に表示されることが保証されますが、場所は実際に生成された乱数によって決定されます。

<替>代替方法

要素を直接交換するDurstenFeldバージョンのFisher-Yates Shuffleアルゴリズムを使用することをお勧めします。このような拡張機能を使用して実装できます:

<能>パフォーマンスの最適化

パフォーマンスをさらに最適化するために、要素をシャッフルするときにすぐに要素を返すことができ、それにより不必要な作業が削減されます:(このコードは前のコードとまったく同じで、繰り返されます)

<说>重要な説明

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];
    }
}
ログイン後にコピー
同じデジタルシーケンスを複数回生成しないようにして、適切なランダムインスタンスを使用して、スレッドセキュリティを維持する必要があります。

">

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート