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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-31 19:06:10763ブラウズ

Is `OrderBy(x =>r.next()) `リストをシャッフルする効果的な方法は?

リストシャッフル:効果的かどうか?

一部のプログラマーはを使用してリストをシャッフルしますが、これは最良のアプローチですか?そのメカニズムと効率を調べましょう。OrderBy(x => r.Next())

それがどのように機能するか

OrderBy(x => r.Next())

このメソッドは、リスト内の各アイテムに乱数を割り当て、これらの乱数に基づいてリストをソートします。 これにより、リストがランダムに効果的に再配置されます

パフォーマンスの問題

主要な欠点はパフォーマンスです。

メソッドにはO(n log n)の時間複雑さがあり、より大きなリストの他のO(n)シャッフルアルゴリズムよりも大幅に遅くなります。

より良い解決策:フィッシャーイエートシャッフル

はるかに効率的な代替品は、スワッピングアルゴリズムを使用するFisher-Yates Shuffle(具体的にはDurstenfeldのバリアント)です。 この例は、このアプローチを使用した再利用可能なOrderByメソッドを示しています:

この改善されたバージョンは、シャッフルするにつれて要素を生成し、メモリの使用と処理を最適化します。

Shuffle

に関する重要なメモ
<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>

クラス:

で作業するときは、これらのポイントを覚えておいてください

複数のRandomインスタンスを迅速に作成すると、同様の乱数シーケンスにつながる可能性があります。

クラスはスレッドセーフではありません。

Random

これらの落とし穴を避けるために
    クラスを使用することに関するベストプラクティスについては、リンクされた記事を参照してください。

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

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