C# fisher-yates洗牌算法的阵列误差
我试图编写c#代码,我想使用,但它对我来说太复杂了,所以我简化为下面的代码,但我得到了一些错误“[error]致命的未处理异常:System.IndexOutOfRangeException:索引超出了数组的边界。”我不知道出了什么问题。请帮忙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 =
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开始,错误就会消失。