用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中文网其他相关文章!