Найти дубликат дня рождения (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);
}
}