用Random
和OrderBy
洗牌列表:高效算法嗎?
本文探討使用Random
和OrderBy
是否為洗牌列表的有效方法。
方法
提供的代碼為每個元素生成一個隨機數,並根據這些數字重新排序列表:
<code>var r = new Random(); var shuffled = ordered.OrderBy(x => r.Next());</code>
評估
雖然這種方法看起來很直觀,但它有一些缺點:
替代方案
更好的洗牌算法是Fisher-Yates洗牌,它將元素交換到列表中的隨機位置。這提供了更均勻的分佈,並且複雜度為O(n)。
實現
<code>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; } return elements; }</code>
此擴展方法簡化了Fisher-Yates洗牌的使用,並避免了生成新數組的需要。
結論
Random
和OrderBy
可用於洗牌,但它們存在效率和偏差問題。 Fisher-Yates洗牌提供了一種更高效且無偏差的解決方案,在大多數需要洗牌的應用程序中是首選。
以上是是否使用'隨機”和'訂單”來調整列表的有效方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!