Почему я получаю эту ошибку в своем коде JAVA?

Парадокс дня рождения говорит о том, что вероятность того, что два человека в комнате будут иметь один и тот же день рождения, составляет более половины, если число людей в комнате (n) больше 23. Это свойство не является на самом деле парадоксом, но многие люди находят это удивительным. Разработайте программу на C++, которая может проверить этот парадокс с помощью серии экспериментов со случайно сгенерированными днями рождения, которые проверяют этот парадокс для n =5, 10, 15, 20, .,,, 100. Вы должны выполнить не менее 10 экспериментов для каждого значения n, и для каждого n должно быть выведено количество экспериментов для этого n, так что два человека в этом тесте имеют одинаковый день рождения.

package birth;
import java.util.Random;

/* Question: 
The birthday paradox says that the probability that two people in a room
will have the same birthday is more than half as long as the number of
people in the room (n), is more than 23. This property is not really a paradox,
but many people find it surprising. Design a C++ program that can
test this paradox by a series of experiments on randomly generated birthdays,
which test this paradox for n =5, 10, 15, 20, . . . , 100. You should run
at least 10 experiments for each value of n and it should output, for each
n, the number of experiments for that n, such that two people in that test
have the same birthday.
*/

public class birth {

public static final int YEAR = 365;

public static void main(String[] args)
{

    int numOfPeople = 5;
    int people = 5;

    //DOB array
    int[] birthday = new int[YEAR];



    //Creates an array that represents 365 days
    for (int i = 0; i < birthday.length; i++)
        birthday[i] = i + 1;

    //Random Number generator
    Random randNum = new Random();

    int iteration = 1;

    //iterates around peopleBirthday array
    while (numOfPeople <= 100)
    {
        System.out.println("Iteration: " + iteration);
        System.out.println();
        //Creates array to holds peoples birthday
        int[] peopleBirthday = new int[numOfPeople];


        //Assigns people DOB to people in the room
        for (int i = 0; i < peopleBirthday.length; i++)
        {
            int day = randNum.nextInt(YEAR + 1);
            peopleBirthday[i] = birthday[day];


        }
        for (int i = 0; i < peopleBirthday.length; i++)
        {   


            //stores value for element before and after
            int person1 = peopleBirthday[i];
            int person2 = i + 1;

            //Checks if people have same birthday
            for (int j = person2; j < peopleBirthday.length; j++)
            {


                //Prints matching Birthday days
                if (person1 == peopleBirthday[j])
                {
                    System.out.println("P1: " + person1 + " P2: " + peopleBirthday[j]);
                    System.out.println("Match!!! \n");

                }
            }
        }


        //Increments the number of people in the room
        numOfPeople += 5;
        iteration++;
    }

    }
}

Я получаю ошибку: java.lang.ArrayIndexOutOfBoundsException: 365 Я не могу понять, что не так с моим кодом

2 ответа

Решение

Было бы неплохо, если бы вы указали точный номер строки, в которую было сгенерировано исключение (информация содержится в полученной вами трассировке стека ошибок), но вполне вероятно, что проблема возникает здесь:

int day = randNum.nextInt(YEAR + 1); // 365 + 1 = 366
peopleBirthday[i] = birthday[day];

Документация для Random.nextInt гласит:

Возвращает: следующее псевдослучайное, равномерно распределенное значение int между нулем (включительно) и границей (исключая) из последовательности этого генератора случайных чисел.

В этом случае вы звоните Random.nextInt со значением 366 (365 + 1), так что это означает, что вы эффективно читаете какое-то случайное число между 0 а также 365, Если вы когда-нибудь получите 365, что сделаю birthday[day] выбросить исключение вне границ, так как максимальный индекс вашего массива 364не 365,

Вы, вероятно, хотели прочитать случайное значение таким образом:

int day = randNum.nextInt(YEAR); // 365 (exclusive)

Массивы в Java основаны на нуле. Если вы создаете birthday с длиной 365индексы будут из 0 в 364,

Вам нужно изменить эту строку из этого:

int[] birthday = new int[YEAR];

К этому:

int[] birthday = new int[YEAR+1];
Другие вопросы по тегам