birthday paradox

0

Dzień dobry,
mam problem z paradoksem z tytułu, wynik powinien być 23 a wychodzi 24-25, wie ktoś może w czym może być problem? Pętelka:

int main()
{
    srand(time(0));
    int licznik = 0;
    for (int i = 0; i < 100000; i++)
    {
        bool dzienUrodzin[365] = { 0 };
        while (true)
        {
            licznik++;
            int los = ((rand() % 364));
            if (dzienUrodzin[los])
                break;
            dzienUrodzin[los] = true;
        }
    }
    std::cout << licznik / 100000.0;
}

informacje o paradoksie: https://pl.wikipedia.org/wiki/Paradoks_dnia_urodzin

Wydaje mi się że nie ma nigdzie błędu ( prosty kod ) ale wynik nie jest taki jak powinien być : d Z góry dziękuję za pomoc : D

0

Nie patrząc na sam algorytm, powinieneś raczej mieć rand() % 365.

1

Uwielbiam jak ludzie nadają nazwę paradoks, czemuś co wcale paradoksem nie jest.

0

Nie ja wymyślałem nazwę : D, losujemy od 0 do 364 czyli 365 wartości dlatego jest 365 : ), jak wkleicie ten kod to też wychodzi Wam ~25? Nie wiedzę w nim błędu a powinno wyjść 23 : d

0

@Samiec Alfa: ile Twoim zdaniem wynosi 364 % 364? ;-)
Albo inaczej: dla jakiego n spełnione będzie n % 364 = 364? (podpowiedź: dla żadnego, czyli obcinasz sobie jeden dzień z obliczeń)

0

Dobra przekonałeś mnie : D ale to nie rozwiązuję problemu, nadal jest błędna wartość, może coś przeoczyłem ?

0

Zmień inta na double.

0

przy wyświetlaniu mam zmiane:

std::cout << licznik / 100000.0;
0

Ktoś ma jakiś pomysł dlaczego wynik jest błędny ?

2

Mam wrażenie, że nie to liczysz co chcesz. Napisałem dwa programy:
Pierwszy program liczy przy której wylosowanej dacie następuje pierwsze powtórzenie, robiłem 10000 testów, wyniki były zawsze między 24 a 25, przypuszczam, że Twój program (którego nie chcę mi się analizować) liczy to samo.
Drugi program losuje 1000 razy i dat (15<=i<=30) i wyświetla stosunek w_ilu_losowaniach_się_powtórzyło/1000. Wyniki są zgodne z teorią.

        int tests = 1000;
        int duplicate = 0;
        HashSet<Integer> days = new HashSet<Integer>();
        for(int i=15;i<=30;i++)
        {
            duplicate = 0;
            for(int j=0;j<tests;j++)
            {
                days.clear();
                for(int k=0;k<i;k++)
                {
                    days.add(r.nextInt(365));
                }
                if(days.size() < i)
                {
                    duplicate++;
                }
            }
            System.out.println("i = " + i + " frequency = " + duplicate/(float)tests);
    `code>`
i = 15 frequency = 0.246
i = 16 frequency = 0.273
i = 17 frequency = 0.325
i = 18 frequency = 0.372
i = 19 frequency = 0.386
i = 20 frequency = 0.393
i = 21 frequency = 0.463
i = 22 frequency = 0.481
i = 23 frequency = 0.513
i = 24 frequency = 0.536
i = 25 frequency = 0.549
i = 26 frequency = 0.602
i = 27 frequency = 0.642
i = 28 frequency = 0.641
i = 29 frequency = 0.705
i = 30 frequency = 0.709

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0