如何解决“indexoutorange”异常错误

本文关键字:indexoutorange 异常 错误 何解决 解决 | 更新日期: 2023-09-27 18:07:18

我不明白是怎么回事。

     static int WinningColumn()
    {
        Random rnd = new Random(46);
        int[] winningnumbers = new int[6];
        int[] Check = new int[46];
        int i;
        for (i = 0; i < winningnumbers.Length; i++)
        {
            winningnumbers[i] = rnd.Next(46);
            Check[winningnumbers[i]]++;
            if (Check[winningnumbers[i]] > 1)
            {
                i--;
                continue;
            }

错误发生在这里:

        }
        return winningnumbers[i];
       }

如何解决“indexoutorange”异常错误

退出for循环时,索引器变量i的值大于可能的最大索引值(这是终止循环的条件)。
在您的例子中,变量i的值为6,但数组winningnumbers的最大索引可能是5。(0到5是6个整数元素)。

不清楚你的意图是什么,但假设你的目的是生成从0到45的六个中奖号码,那么你的代码应该以这种方式重写和简化

static List<int> WinningColumn()
{
    // Do not initialize Random with a fixed value
    // You will get always the same 'random' sequence
    Random rnd = new Random();
    // Create a list to store the winners
    List<int> winningnumbers = new List<int>();
    int i = 0;
    while(i < 6)
    {
        int newNumber = rnd.Next(46);
        if(!winningnumbers.Contains(newNumber))
        {
            // If the list doesn't contain the number the add it and increment i
            // Otherwise run the loop again....
            winningnumbers.Add(newNumber);
            i++;
        }
    }
    // This returns the whole list to the caller, 
    // you can use it as an array 
    return winningnumbers;
}

请注意,您的实际代码在随机数生成器的声明中包含一个错误。您传递了一个初始种子,因此,每次调用此方法时,随机生成器都会以相同的数字序列再次启动。结果将是一个相同的数字列表。对我来说不是很随机
如果您不传递任何内容,则生成器将使用系统时间初始化,因此每次调用此方法时都应该不同。

我不知道你想达到什么目的。

但是当i变为6时,循环将终止。所以你基本上是试图访问winningnumbers[6],这是不正确的,因为winningnumbers数组的长度为6,所以你可以使用从0到5的索引。

你可以试试winningnumbers [i-1]