C# 按随机数顺序对列表进行排序

C# 按随机数顺序对列表进行排序,c#,asp.net,random,C#,Asp.net,Random,我有一个列表,每次都要按随机顺序排序 我遇到了几种方法: 静态随机=新随机(); 公共静态IEnumerable随机置换(IEnumerable序列) { T[]retArray=sequence.ToArray(); 对于(int i=0;i

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

我遇到了几种方法:

  • 静态随机=新随机();
    公共静态IEnumerable随机置换(IEnumerable序列)
    {
    T[]retArray=sequence.ToArray();
    对于(int i=0;i

  • 显然,1和3之间的代码量有很大的差异,但是有什么好处吗?

    第一个好处就是不好。虽然某些GUID实现可能依赖随机性,但其他GUID实现则不依赖随机性。这里的结果是,在一台机器上运行的完全相同的程序可以工作,而在另一台机器上则不能。这是非常糟糕的,因为这意味着你要测试你的程序,它会很好的出来,你会发布它,然后事情就会破裂

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

    第二种方法可行,但效率明显低于第三种方法。排序的渐近复杂度比您在这里展示的第三种算法(O(n*log(n))而不是O(n))要高


    如果每次你想使用它时都要写代码,那么这个方法可能有2行而不是12行的价值,但是当你只需要写一次,并且只要在你需要洗牌序列的任何时候引用通用的洗牌方法,你就可以证明使用语义正确且更有效的代码是合理的。(毕竟它没有那么长或复杂。)

    前两个是错误的,不能可靠地工作;它们不一定是随机性的来源。@SLaks第一个是,第二个不是,只是效率较低。好吧,我想从技术上讲,它们最初的顺序有一个非常非常小的偏差,因为它使用了一个稳定的排序,而第三个选项没有那么小的偏差,但是只要项目的数量不接近总整数的数量,这就不应该是一个问题。
    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;
    }