【问题标题】:Sort list in random number order按随机数顺序排序列表
【发布时间】:2013-05-17 18:28:07
【问题描述】:

我有一个列表,我想每次都按随机顺序排序。

我遇到了几种方法:

  1. list = list.OrderBy(x => Guid.NewGuid()).ToList();
    
  2. var rnd = new Random();
    myList = myList.OrderBy(x => rnd.Next()).ToList();
    
  3. 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的代码量差别很大,但是有什么好处吗?

【问题讨论】:

标签: c# asp.net random


【解决方案1】:

第一个只是坏事。 GUIDs are unique, but they are not necessarily random. 虽然某些 GUID 实现可能依赖于随机性,但另一些则不会。这里的结果是在一台机器上运行的完全相同的程序可以工作,而在另一台机器上则不能。这真的很糟糕,因为这意味着你将测试你的程序,它会很好,你会发布它,然后事情就会崩溃。

第三个是相当标准的洗牌算法。在解决这个问题时,我通常会使用它。

第二个选项会起作用,但它的效率明显低于第三个选项。排序的渐近复杂度高于您在此处显示的第三种算法(O(n*log(n)) 而不是 O(n))。

如果您每次想要使用它时都必须编写代码,那么该方法中的价值可能是 2 行而不是 12 行,但是当您只需要编写一次并简单地引用该通用 shuffle 方法时任何时候您需要对序列进行洗牌,您都可以使用语义上正确且更有效的代码来证明其合理性。 (毕竟它没有那么长或复杂。)

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 2016-10-03
    • 2011-06-18
    • 2012-11-19
    • 2019-03-19
    • 1970-01-01
    • 2019-08-24
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多