shuffle(随机重新排列)List <string>

bru*_*rux 21 c# random algorithm

我需要重新排列我的List数组,它中包含不可确定数量的元素.

有人能举例说明我是怎么做到的,谢谢

Dar*_*rov 59

List<Foo> source = ...
var rnd = new Random();
var result = source.OrderBy(item => rnd.Next());
Run Code Online (Sandbox Code Playgroud)

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

  • 不......这是一个坏主意,请阅读:http://blogs.msdn.com/b/ericlippert/archive/2011/01/31/spot-the-defect-bad-comparisons-part-four.aspx (8认同)
  • @chillitom,没有这个在那篇文章中没有问题.在Eric的文章中,随机性很差,并且比较也打破了比较方法的总排序要求.在Darin的例子中,每个项目被分配一次随机数,然后根据它进行排序.我认为kprobst的解决方案仍然更好(众所周知的高效改组算法),但Darin也是正确的. (4认同)

kpr*_*bst 20

这是一个将随机播放的扩展方法List<T>:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这个实现有问题!在每次调用时初始化一个新的"Random"将产生可预测的洗牌结果.相反,将`private static readonly Random rnd = new Random();`放入此方法所在的静态类中.最后,如果您已经[给出了这个答案的来源](http:// stackoverflow),那就太好了. com/revisions/1262619/1)信用,因为那时你的帖子中的缺陷可能会在人们离开之前很早就被发现并且在没有任何暗示需要修复的情况下使用它. (10认同)