首页 >后端开发 >C++ >是否使用' orderby”与`random”一种有效的方法来调整列表吗?

是否使用' orderby”与`random”一种有效的方法来调整列表吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-31 18:51:10906浏览

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