fisher-yates shuffle算法的数组错误

时间:2016-03-30 17:25:16

标签: c# arrays

我正在尝试为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);
        }
    }    
}

1 个答案:

答案 0 :(得分:0)

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

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