C# fisher-yates洗牌算法的阵列误差

C# fisher-yates洗牌算法的阵列误差,c#,arrays,C#,Arrays,我试图编写c#代码,我想使用,但它对我来说太复杂了,所以我简化为下面的代码,但我得到了一些错误“[error]致命的未处理异常:System.IndexOutOfRangeException:索引超出了数组的边界。”我不知道出了什么问题。请帮忙 using System; class Program { static Random _random = new Random(); static void Shuffle(int[] array) { int p =

我试图编写c#代码,我想使用,但它对我来说太复杂了,所以我简化为下面的代码,但我得到了一些错误“[error]致命的未处理异常:System.IndexOutOfRangeException:索引超出了数组的边界。”我不知道出了什么问题。请帮忙

using System;
class Program
{
    static Random _random = new Random();
    static void Shuffle(int[] array)
    {
    int p = array.Length;
    for (int n = p; n > 1 ; n--)
    {
        int r = _random.Next(1, n);
        int t = array[r];
        array[r] = array[n];
        array[n] = t;
    }
    }
    static void Main()
    {
        int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
        Shuffle(array);
        foreach (int value in array)
        {
        Console.WriteLine(value);
        }
    }    
}

int p=array.Length;
用于(int n=p;n>1;n--)


这两条线就是问题所在。数组是0索引的,因此从数组的长度开始,就已经超出了范围。您可以通过从
p
中立即减去一来修复它,如下所示:
intp=array.Length-1。另外,您应该让
n
转到0,以便到达数组的所有元素:
n>=0

n
的初始值是
array.Length
并且在循环内索引
array[n]
。这是个例外。C#中的数组是零索引的。因此,从n=p-1到0开始,错误就会消失。