首頁 >後端開發 >C++ >是否使用' orderby”與`random”一種有效的方法來調整列表嗎?

是否使用' orderby”與`random”一種有效的方法來調整列表嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-31 18:51:10907瀏覽

Is Using `OrderBy` with `Random` an Efficient Way to Shuffle a List?

RandomOrderBy進行列表洗牌的效率如何?

本文探討使用RandomOrderBy方法洗牌列表的效率問題。代碼示例如下:

<code class="language-csharp">var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());</code>

代碼工作原理

這段代碼使用Random類生成隨機數。對於ordered列表中的每個元素,OrderBy方法使用lambda表達式x => r.Next()為其分配一個隨機數。然後,根據這些隨機數對列表進行升序排序,從而實現洗牌效果。

這種洗牌算法的效率如何?

雖然這段代碼可以實現洗牌的目的,但其效率存在問題。 OrderBy方法底層使用了O(n log n)的排序算法,這對於洗牌任務來說過於復雜,因為洗牌只需要O(n)的時間複雜度。

更好的方法和考慮因素

更有效的洗牌算法是Fisher-Yates洗牌算法,它簡單易懂,並且具有O(n)的時間複雜度。為了方便和清晰,可以創建一個使用Fisher-Yates算法的Shuffle擴展方法。

Fisher-Yates洗牌算法通過迭代列表,將元素與隨機選擇的前面元素交換來實現洗牌。下面是一個簡單的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);
        T tmp = elements[i];
        elements[i] = elements[swapIndex];
        elements[swapIndex] = tmp;
    }
    foreach (T element in elements)
    {
        yield return element;
    }
}</code>

使用Fisher-Yates算法可以避免OrderBy帶來的計算開銷,同時保持洗牌功能。

以上是是否使用' orderby”與`random”一種有效的方法來調整列表嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn