随机列表<t> </t>

时间:2010-02-20 04:16:00

标签: c# list shuffle

  

可能重复:
  Randomize a List<T> in C#

我有一个列表,其中包含数千个文件路径到音频文件的位置,并且想知道哪种“最有效的方式”对列表进行“洗牌”?

非常感谢任何帮助:)

谢谢

4 个答案:

答案 0 :(得分:13)

Fisher-Yates Shuffle或者也称为Knuth shuffle。

答案 1 :(得分:8)

这是Fischer-Yates / Knuth shuffle的简单(但有效)实现:

Random rnd = new Random();
for (int i = files.Length; i > 1; i--) {
  int pos = rnd.Next(i);
  var x = files[i - 1];
  files[i - 1] = files[pos];
  files[pos] = x;
}

或略有变化:

Random rnd = new Random();
for (int i = 1; i < files.Length; i++) {
  int pos = rnd.Next(i + 1);
  var x = files[i];
  files[i] = files[pos];
  files[pos] = x;
}

由于这是一个O(n)操作,它是改组列表的最有效方法。由于列表中的所有项目都必须有机会被移动,因此无法比O(n)更有效地重排列表。

我通过使用这种方法和当前接受的答案(LINQ OrderBy)对每个项目进行了一千次处理,进行了一次小的性能测试,这大约快了15倍(!)。

答案 2 :(得分:5)

myList.OrderBy(Guid.NewGuid())

答案 3 :(得分:0)

我将Jon Skeet的解决方案从this question添加到了我的扩展库中。我实现了一些方法,它们都使用外部随机数生成器,并使用默认实现(随机)创建一个。