我正在尝试为modern fisher yates shuffle algorithm制作c#代码,我想使用this,但这对我来说太复杂了,所以我简化为下面的代码,但是我收到了一些错误“[错误]致命的未处理EXCEPTION: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);
}
}
}
答案 0 :(得分:0)
int p = array.Length;
for (int n = p; n > 1 ; n--)
这两行是问题所在。数组是0索引的,所以从数组的长度开始,你已经超出了范围。您可以通过立即从p
中减去一个来修复它,如下所示:int p = array.Length - 1;
。此外,您应该让n
转到0,以便覆盖数组的所有元素:n >= 0
。