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