首页 >后端开发 >C++ >是否使用'随机”和'订单”来调整列表的有效方法?

是否使用'随机”和'订单”来调整列表的有效方法?

Linda Hamilton
Linda Hamilton原创
2025-01-31 18:56:10120浏览

Is Using `Random` and `OrderBy` an Efficient Way to Shuffle a List?

RandomOrderBy洗牌列表:高效算法吗?

本文探讨使用RandomOrderBy是否为洗牌列表的有效方法。

方法

提供的代码为每个元素生成一个随机数,并根据这些数字重新排序列表:

<code>var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());</code>

评估

虽然这种方法看起来很直观,但它有一些缺点:

  • 计算复杂度:其时间复杂度为O(n log n),对于大型列表来说效率低下。更优的洗牌算法具有O(n)的复杂度。
  • 潜在问题:基于随机数排序元素可能导致偏差的洗牌,某些元素出现的频率可能高于其他元素。

替代方案

更好的洗牌算法是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洗牌的使用,并避免了生成新数组的需要。

结论

RandomOrderBy可用于洗牌,但它们存在效率和偏差问题。Fisher-Yates洗牌提供了一种更高效且无偏差的解决方案,在大多数需要洗牌的应用程序中是首选。

以上是是否使用'随机”和'订单”来调整列表的有效方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn