【发布时间】:2013-05-17 18:28:07
【问题描述】:
我有一个列表,我想每次都按随机顺序排序。
我遇到了几种方法:
list = list.OrderBy(x => Guid.NewGuid()).ToList();var rnd = new Random(); myList = myList.OrderBy(x => rnd.Next()).ToList();static Random random = new Random(); public static IEnumerable<T> RandomPermutation<T>(IEnumerable<T> sequence) { T[] retArray = sequence.ToArray(); for (int i = 0; i < retArray.Length - 1; i += 1) { int swapIndex = random.Next(i + 1, retArray.Length); T temp = retArray[i]; retArray[i] = retArray[swapIndex]; retArray[swapIndex] = temp; } return retArray; }
显然1和3的代码量差别很大,但是有什么好处吗?
【问题讨论】:
-
前两个错误,不能可靠工作。
-
Guids 是独特性的来源;它们不一定是随机性的来源。
-
@SLaks 第一个是,第二个不是,它只是效率较低。好吧,我想从技术上讲,它们最初的顺序存在非常非常小的偏差,因为它使用稳定的排序,而第三个选项没有那么轻微的偏差,但只要项目的数量没有接近不应该成为问题的总整数数量。