【问题标题】:shuffle (rearrange randomly) a List<string> [duplicate]随机播放(随机重新排列)一个 List<string> [重复]
【发布时间】:2011-03-21 20:48:25
【问题描述】:

我需要重新排列我的 List 数组,其中的元素数量无法确定。

谁能给我一个例子,谢谢

【问题讨论】:

标签: c# algorithm random


【解决方案1】:
List<Foo> source = ...
var rnd = new Random();
var result = source.OrderBy(item => rnd.Next());

显然,如果您想要真正的随机性而不是伪随机数生成器,您可以使用 RNGCryptoServiceProvider 而不是 Random

【讨论】:

  • 不……这是个坏主意,请阅读:blogs.msdn.com/b/ericlippert/archive/2011/01/31/…
  • 真的有随机性吗?我认为这是不可能的。
  • @chillitom,不,这不存在那篇文章中的问题。在 Eric 的文章中,随机性的种子很差,而且比较也打破了比较方法的总排序要求。在这里 Darin 的示例中,每个项目都分配了一个随机数,然后根据它进行排序。我认为 kprobst 的解决方案仍然更好(众所周知的高效混洗算法),但 Darin 的解决方案也是正确的。
  • 坏主意,见 cmets here
  • 似乎不起作用。总是以相同的顺序获取列表? :(
【解决方案2】:

这是一种扩展方法,可以随机播放List&lt;T&gt;

    public static void Shuffle<T>(this IList<T> list) {
        int n = list.Count;
        Random rnd = new Random();
        while (n > 1) {
            int k = (rnd.Next(0, n) % n);
            n--;
            T value = list[k];
            list[k] = list[n];
            list[n] = value;
        }
    }

【讨论】:

  • +1 我没有在我的代码中测试过这个(即不确定它是否有效),但到目前为止我喜欢它!每个元素都会被打乱,还是没有必要?
  • 你可以直接说int k = rnd.Next(0, n)% 是不必要的,因为股息总是小于 n
  • 看起来像一个健全的 Fisher-Yates 实现,这就是我要提供的。
  • 这个实现有问题!在每次调用时初始化一个新的Random 将产生可预测的洗牌结果。相反,将private static readonly Random rnd = new Random(); 放入该方法所在的静态类中。最后,如果您给予your source for this answer 信用,那就太好了,因为这样您自己帖子中的缺陷可能会在人们离开并使用之前更快地被发现它没有任何提示需要修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多