mindstalk: (Default)
mindstalk ([personal profile] mindstalk) wrote2010-02-18 01:54 am
Entry tags:

Probability challenge

Yeah, I'm behind on posting news links and such. Moving on!

Given 11 people, what is the probability that 3 of the 11 share the same birthday? Assuming uniform distribution of birthdays in the population, of course.

This seems a lot harder than the classic problem of finding whether at least two have the same birthday. I debunked a couple of answers, came up with a nice one of my own for "at least 3 share, and I don't care about anyone else" which came nowhere near simulation, then someone else came up with an answer for "3 people share a birthday, and the other 8 don't share any birthdays" which matched debugged simulation, and that one's actually fairly easy in retrospect (in my defense, it wasn't the problem I'd been thinking about.) I still don't know why I'm so far off for the "at least" case.
ext_110843: (Default)

[identity profile] oniugnip.livejournal.com 2010-02-18 05:34 pm (UTC)(link)
I like that you did this in simulation!

(would you post the code?)

[identity profile] mindstalk.livejournal.com 2010-02-18 05:46 pm (UTC)(link)
Well, I did math first, until someone on gale did simulation and got wildly different numbers, so I did sim and got the same wildly different number.

It's nothing much:
from random import *
triplets=0
for j in xrange(100000):
    bdays={}
    for i in range(11):
        b=randint(1,365)
        if b in bdays:
            bdays[b]+=1
        else:
            bdays[b]=1
#    if max(bdays.values()) == 2 and len(bdays)==8:
    if max(bdays.values()) >= 3 
       triplets+=1

print triplets


Commented line is for finding the probability of exactly 3 pairs, vs. at least one triplet-or-more.

First version was less elegant and ultimately less flexible:

from random import *
triplets=0
for j in xrange(100000):
    bdays=[]
    for i in range(11):
        bdays.append(randint(1,365))
    if len(bdays)==len(set(bdays)):
        continue
    else:
        for i in range(11):
            match=0
            for k in range(i+1,11):
                if bdays[i]==bdays[k]:
                    match+=1
            if match>=2:
                triplets+=1

print triplets


which actually inflates 'match' but for these purposes it doesn't matter because we only care about the threshold.

Python code, if that's not obvious.
Edited 2010-02-18 17:48 (UTC)