简体   繁体   中英

Why am I getting this error in my JAVA code?

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.

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++;
    }

    }
}

I am getting a error: java.lang.ArrayIndexOutOfBoundsException: 365 I can't figure out what is wrong with my code

It would be nice if you provided the exact line number where the exception was thrown (the information is in the error stack trace that you got), but it's very likely that the problem occurs here:

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

The documentation for Random.nextInt says:

Returns: the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive) from this random number generator's sequence.

In this case, you are calling Random.nextInt with a value of 366 ( 365 + 1 ), so that means that you are effectively reading some random number between 0 and 365 . If you ever do get 365 , that will make birthday[day] throw the out of bounds exception, as the maximum index of your array is 364 , not 365 .

You probably meant to read the random value this way instead:

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

Arrays in Java are zero based. If you create birthday with a length of 365 , the indexes would be from 0 to 364 .

You need to change this line from this:

int[] birthday = new int[YEAR];

To this:

int[] birthday = new int[YEAR+1];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM