随机列表<T>

16 c# shuffle list

可能重复:
在C#中随机化List <T>

我有一个列表,其中包含数千个FilePath到音频文件的位置,并想知道哪个是"洗牌"列表的最有效方法?

任何帮助是极大的赞赏 :)

谢谢

小智 13

Fisher-Yates Shuffle或者也被称为Knuth shuffle.

  • ...我只是赞成你,因为我喜欢你的答案:)不知道为什么它被投票了? (3认同)
  • 顺便说一句,为了更快的改组,我建议你洗牌整数列表/数组(使用你选择的任何方法),并使用该混洗列表/数组作为文件名列表的索引.交换文件名可能会成为瓶颈. (3认同)
  • ......这是O(n),所以你不能比这更好. (2认同)

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

或略有变化:

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

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

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


Est*_*aya 5

myList.OrderBy(Guid.NewGuid())

  • 一些GUID生成算法会生成单调值,因此这可能不会产生随机结果.但是,使用其他随机源(可能是随机的)类似的东西也可以. (2认同)