Найти дубликат дня рождения (Java)

Код должен запускать симуляции, чтобы узнать вероятность того, что n людей будут иметь одинаковый день рождения.

Я сравнил случайно назначенные даты рождения с массивом дат. Для любых дат, у которых есть больше чем 1 равное значение, я добавил один к числителю.

Тем не менее, ответ выходит неправильным для кода. Я не уверен почему.

import java.util.Scanner;
public class birthday {
public static void main (String[] args) {

Scanner inp = new Scanner(System.in);

System.out.println("How many trials");
int n = inp.nextInt();

//variable declaration
double[] birthdate = new double[n];
int num = 0;
int numerator = 0;
double bday = 0;
int trials = 0;

//assign birthdays to n people
for (int i = 0; i < n; i++)
{
    birthdate[i] = Math.floor(Math.random() * 365) + 1;
    System.out.println(birthdate[i]);
}

for (int i = 1; i <= 365; i++)
{
    for (int j = 0; j < n; j++)
    {
        bday = birthdate[j];

        //compare birthdates to dates
        if (bday == i)
            {
                num++;
                if (num > 1)
                {
                    numerator++;
                }
            }
    }
    num = 0;
}

double ans = (double) numerator / n;
System.out.println("The answer is " + ans);

}
}

1 ответ

Для любых дат, у которых есть больше чем 1 равное значение, я добавил один к числителю.

Это не то, что делает ваш код. Для любой даты, в которой по крайней мере 2 человека имеют день рождения на эту дату, вы добавляете число этих людей минус 1 в числитель.

Если вы хотите, чтобы ваш код работал в соответствии с приведенным выше заявлением, вы должны изменить следующий код

for (int j = 0; j < n; j++)
{
    bday = birthdate[j];

    //compare birthdates to dates
    if (bday == i)
        {
            num++;
            if (num > 1)
            {
                numerator++;
            }
        }
}
num = 0;

к этому коду:

for (int j = 0; j < n; j++)
{
    bday = birthdate[j];

    //compare birthdates to dates
    if (bday == i)
        {
            num++;
        }
}
if (num > 1)
{
    numerator++;
}
num = 0;

Таким образом, код if (num > 1) numerator++ не повторяется для каждого человека (начиная со второго), но выполняется только один раз в день.

В любом случае, я сомневаюсь, что любая из версий кода рассчитывает "вероятность того, что n людей будут иметь один и тот же день рождения". Если это то, что вы хотите приблизить, вы должны повторить весь эксперимент много раз, сосчитать, во сколько из этих случаев n человек делили свой день рождения, и поделить его на количество экспериментов:

import java.util.Scanner;

public class birthday {
    public static void main(String[] args) {

        Scanner inp = new Scanner(System.in);

        System.out.println("How many trials?");
        int numExperiments = inp.nextInt();

        System.out.println("How many persons?");
        int n = inp.nextInt();

        // variable declaration
        int dups = 0;
        for (int k = 0; k < numExperiments; k++) {
            boolean foundDup = false;
            int[] birthdate = new int[n];

            // assign birthdays to n people
            for (int i = 0; i < n; i++) {
                birthdate[i] = (int) (Math.random() * 365) + 1;
            }

            // check, if there is a duplicate
            for (int i = 1; i <= 365; i++) {
                int num = 0;
                for (int j = 0; j < n; j++) {
                    // compare birthdates to dates
                    if (birthdate[j] == i) {
                        num++;
                    }
                }
                if (num > 1) {
                    foundDup = true;
                }
                num = 0;
            }

            // count cases with duplicates
            if (foundDup) {
                dups++;
            }
        }

        double ans = (double) dups / numExperiments;
        System.out.println("The answer is " + ans);
    }
}
Другие вопросы по тегам