小智 13
Fisher-Yates Shuffle或者也被称为Knuth shuffle.
这是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倍(!).
myList.OrderBy(Guid.NewGuid())
| 归档时间: |
|
| 查看次数: |
20492 次 |
| 最近记录: |