首頁 >後端開發 >C++ >是否使用'隨機”和'訂單”來調整列表的有效方法?

是否使用'隨機”和'訂單”來調整列表的有效方法?

Linda Hamilton
Linda Hamilton原創
2025-01-31 18:56:10124瀏覽

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