Выполнение анализа Монте-Карло парадокса дня рождения с использованием HashSet

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я НЕ ХОЧУ ОТВЕТИТЬ НА ЭТУ ПРОБЛЕМУ. Мне ПРОСТО НУЖНО НЕКОТОРЫЕ УКАЗАНИЯ.

Я хочу провести анализ Монте-Карло над печально известным Парадоксом Дня Рождения (определяя вероятность того, что по крайней мере 2 человека в данной группе имеют одинаковый день рождения), используя HashSet,

Теперь, когда я запускаю это, collisionCount ПУТЬ ниже, чем я ожидал. Во-первых, я ожидал collisionCount для группы из 10 человек - 11446 (или вероятность 0.11446). Затем, когда я добрался до 100 человек, я ожидал, что коллизионный счет составит 100 000 (с вероятностью 1,0). Но вместо этого, для каждых 10 человек, коллизионный счет считается только 1 (10 человек: 1 столкновение, 20 человек: 2 столкновения, 30 человек: 3 столкновения и т. Д.).

Вот код, который я написал до сих пор:

import java.util.HashSet;
import java.util.Random;
import java.util.Set;


public class BirthdayParadox
{
public static void main(String [] args)
{
    Random rand = new Random();


    int tests = 100000;
    int collisionCount = 0;

    for(int people = 10; people <= 100; people += 10)
    {
        Set<Integer> birthdays = new HashSet<>(365);
        birthdays.add(rand.nextInt(365));
        for(int runs = 0; runs < tests; runs++)
        {
            int randomBirthday = rand.nextInt(365);

            if(birthdays.contains(randomBirthday))
            {
                collisionCount++;
                break;
            }
            birthdays.add(randomBirthday);
        }
        float prob = (float)collisionCount / tests;

            System.out.println("After " + tests + " tests there were " +
                               collisionCount + " occurrences of shared " +
                               " birthdays in a set of " + people + " people.");
            System.out.println("Probability : " + prob);
    }
  }  
 }

Я предполагаю, что мой вопрос: я не делаю что-то правильно с любым из моих циклов for, чтобы получить collisionCount правильно считать?

Я новичок в изучении Java, я новичок в сообществе Stack Overflow и все еще учусь. Любая помощь / совет / советы с благодарностью.

2 ответа

Похоже, ваша проблема в том, что вы пропустили одну из ваших петель.

Обратите внимание, что ваш runs петля разрывается при первом столкновении. Это означает, что ваша ценность никогда не будет больше 1.

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

Что вам нужно сделать, это запустить вашу симуляцию 100_000 раз. Способ сделать это - поместить логику в свой runs цикл, который проверяет, если people у людей будет день рождения, а затем итерация вашего количества столкновений.

Я думаю, что Java-решение не самое лучшее, это, вероятно, проблема в том, почему у вас есть разница между симуляцией и математическими значениями. Что я понимаю для этой проблемы, так это то, что вы должны определить для группы из 10 человек (в данном случае), сколько из них имеют один и тот же день рождения. Для этого вам нужно случайным образом выбрать массив из 10 с числом от 0 до 365 (дни года) и посчитать, сколько из них одинаковы. Вы должны сделать это несколько раз (100000 в вашем случае). Я думаю, что вы должны инвертировать заказ FOR. Я имею в виду..

for(int runs = 0; runs < tests; runs++)
{
    //initialize an array of 10
    for(int people = 0; people <= 10; people +=1)
    {
        //random birthdayDay
        //array [people] = rand.nextInt(365);

    }
    //check if there is a collision
    //If there is one you have to increase you success variable in 1   
 }
 //calculate the probability

Я пытаюсь помочь вам, делая вид псевдокода. Надеюсь, что это поможет вам немного.

С уважением

Артуро.

Другие вопросы по тегам