如何修复:线程 "main" java.lang.ArrayIndexOutOfBoundsException 中的异常对于 java 中的布尔随机数数组

how to fix: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException" for boolean array of random numbers in java

我正在制作一个程序,我可以得到他们想要的随机数数量以及他们想要达到的最高数量,但是当我 运行 代码时,它并没有给我他们想要的数字数量要求。它要么给我 1 个数字,要么给我 none。然后它说 "Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9 在 practice4.practice4.main(practice4.java:38)" 红色。

double randomNum;
        int highestNumber, numsInLottery, display;
        boolean[] numberUsed;

        System.out.println("Welcome to the Lottery Number Generator!");

        System.out.println("How many numbers are in your lottery?");
        numsInLottery = TextIO.getInt();

        System.out.println("What is the highest possible number?");
        highestNumber = TextIO.getInt();


        numberUsed= new boolean [numsInLottery];

        for (int index = 0; index < numsInLottery; index++)
        {
        numberUsed [index]= false;

        while(index < highestNumber)
        {
            do
            {

                randomNum = Math.random() * highestNumber + 1;
                display = (int) randomNum ;

            } while (numberUsed [display - 1 ] ); 

        System.out.print(display + " ");
        numberUsed [display + 1] = true;

        }   
        }
        }   
        }

在我拥有 numberUsed= new boolean [numsInLottery]; 之前 我不小心把 highestNumber 放在了 numsInLottery 所在的位置。当我有了它时,它会给我所有的数字。但现在我改变了它,它不再起作用了 这就是我现在得到的

Welcome to the Lottery Number Generator!
How many numbers are in your lottery?
6
What is the highest possible number?
? 30
1 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 21
    at practice4.practice4.main(practice4.java:35)
do
{
    randomNum = Math.random() * highestNumber + 1;
    display = (int) randomNum ;

} while (numberUsed [display - 1 ] );

在此代码中,您正在访问数组的一些随机索引,该索引甚至可能不存在,例如,您将 25 作为随机数,而您只有大小为 6 的数组,因此当您访问 numberUsed[25]你得到 IndexOutOfBounds

的异常

在您的情况下,您似乎需要使用布尔数组来验证之前是否生成过生成的数字,在这种情况下,这就是您需要的核心逻辑。

int[] lotteryNumbers = new int[numsInLottery];
boolean[] lotteryNumberHasBeenGenerated = new boolean[highestNumber];

for(int i=0;i<highestNumber;i++){ //none of the numbers have been generated at this point
    lotteryNumberHasBeenGenerated[i]=false;
}

for (int i = 0; i < numsInLottery; i++) {
    int random;
    do{
        random=((Double)(Math.random() * highestNumber)).intValue();
    }while(lotteryNumberHasBeenGenerated[random]);

    lotteryNumbers[i] = random;
    lotteryNumberHasBeenGenerated[random]=true; //the number is maked as generated

}

这就是诀窍,最终方法应该如下所示:

public void lottery() {

    System.out.println("Welcome to the Lottery Number Generator!");
    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] lotteryNumberHasBeenGenerated = new boolean[highestNumber];

    for(int i=0;i<highestNumber;i++){ //none of the numbers have been   generated at this point
        lotteryNumberHasBeenGenerated[i]=false;
    }

    for (int i = 0; i < numsInLottery; i++) {
        int random;
        do{
            random=((Double)(Math.random() * highestNumber)).intValue();
        }while(lotteryNumberHasBeenGenerated[random]);

        lotteryNumbers[i] = random;
        lotteryNumberHasBeenGenerated[random]=true; //the number is maked as    generated

}

    System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));
}

尽管如果是这种情况,您将错过很多验证:S

Also, The problem you are having in the console logs is thrown in java when you try to access a position in the array that it does not have, for example if you created an array with size 5 and you are accessing the position number 9 or with index 8 Exception. Here is an explanation of how that works

同样,正如我之前提到的,我假设您的教授希望您使用布尔数组来检查随机生成的数字是否已经存在。

实现此目的的一种方法是创建一个布尔值数组 (isLotteryNumberGenerated),其中每个元素都表示是否已生成该元素的索引号(例如,如果我们生成随机数 3 我们检查是否 isLotteryNumberGenerated[3] == truetrue 意味着数字 3 已经生成(反之如果 false)。因此,布尔数组的大小必须为 highestNumber + 1 以便为可能生成的每个数字创建索引(从 0 - highestNumber)

每次为 lotteryNumbers 数组中的元素 i 生成一个随机数时,您需要检查是否已经为另一个 lotteryNumbers 元素生成了该数字。在下面的代码中,我使用了一个 do...while 循环来迭代,直到它生成一个以前没有生成过的数字。

使用上面White_King的一些代码...

public void lottery() {

    System.out.println("How many numbers are in your lottery?");
    int numsInLottery = TextIO.getInt();
    System.out.println("What is the highest possible number?");
    int highestNumber = TextIO.getInt();

    int[] lotteryNumbers = new int[numsInLottery];
    boolean[] isLotteryNumberGenerated = new boolean[highestNumber + 1];

    for (int i = 0; i < numsInLottery; i++) { 
        do { 

            lotteryNumbers[i] = (int) (Math.random() * (highestNumber + 1)); 

        } while (isLotteryNumberGenerated[lotteryNumbers[i]]); 

        isLotteryNumberGenerated[lotteryNumbers[i]] = true; 

    }

   System.out.println("Lottery numbers:\n" + Arrays.toString(lotteryNumbers));

}