用Random
和OrderBy
進行列表洗牌的效率如何?
本文探討使用Random
和OrderBy
方法洗牌列表的效率問題。代碼示例如下:
<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中文網其他相關文章!