Ideone.com

2 min read Original article ↗
  1. # The tuesday boy problem

  2. # http://s...content-available-to-author-only...s.com/evolutionblog/2011/11/08/the-tuesday-birthday-problem/

  3. # http://e...content-available-to-author-only...a.org/wiki/Boy_or_Girl_paradox

  4. # Sounds complicated and counter-intuitive, right?

  5. # Python to the rescue!

  6. # I have changed the wording in the problem to be less ambiguous:

  7. # "If you ask someone whom you know has two children, whether they have

  8. # at least one boy born on a tuesday, what is the probability that

  9. # both children are boys?"

  10. import itertools

  11. import fractions

  12. GENDERS = 'boy girl'.split()

  13. DAYS = 'mon tue wed thu fri sat sun'.split()

  14. def has_two_boys((child1, child2)):

  15. #Do you have two boys?

  16. return child1[0] == 'boy' and child2[0] == 'boy'

  17. def question(child):

  18. #Is this child a boy born on a tuesday?

  19. return child == ('boy', 'tue')

  20. def show_probability(pairs):

  21. nr_boy_pairs = len(filter(has_two_boys, pairs))

  22. print '%d pairs, where %d are boy pairs' % (len(pairs), nr_boy_pairs)

  23. print 'gives', fractions.Fraction(nr_boy_pairs, len(pairs))

  24. print

  25. CHILD_TYPES = list(itertools.product(GENDERS, DAYS))

  26. #All these pairs are equally common

  27. #(if we pretend that each day and gender is equally likely for each birth):

  28. ALL_CHILD_PAIRS = list(itertools.product(CHILD_TYPES, CHILD_TYPES))

  29. print 'Probability that a person has two boys:'

  30. show_probability(ALL_CHILD_PAIRS)

  31. #Now we ask all parents the question

  32. YES_PARENTS = [pair for pair in ALL_CHILD_PAIRS

  33. #Is any of your children a boy born on a tuesday?

  34. if question(pair[0]) or question(pair[1])]

  35. print 'Probability that a person has two boys, given that they answer yes:'

  36. show_probability(YES_PARENTS)

IyBUaGUgdHVlc2RheSBib3kgcHJvYmxlbQojIGh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5zLmNvbS9ldm9sdXRpb25ibG9nLzIwMTEvMTEvMDgvdGhlLXR1ZXNkYXktYmlydGhkYXktcHJvYmxlbS8KIyBodHRwOi8vZS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYS5vcmcvd2lraS9Cb3lfb3JfR2lybF9wYXJhZG94CiMgU291bmRzIGNvbXBsaWNhdGVkIGFuZCBjb3VudGVyLWludHVpdGl2ZSwgcmlnaHQ/CiMgUHl0aG9uIHRvIHRoZSByZXNjdWUhCgojIEkgaGF2ZSBjaGFuZ2VkIHRoZSB3b3JkaW5nIGluIHRoZSBwcm9ibGVtIHRvIGJlIGxlc3MgYW1iaWd1b3VzOgojICJJZiB5b3UgYXNrIHNvbWVvbmUgd2hvbSB5b3Uga25vdyBoYXMgdHdvIGNoaWxkcmVuLCB3aGV0aGVyIHRoZXkgaGF2ZQojICBhdCBsZWFzdCBvbmUgYm95IGJvcm4gb24gYSB0dWVzZGF5LCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0CiMgIGJvdGggY2hpbGRyZW4gYXJlIGJveXM/IgoKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgZnJhY3Rpb25zCgpHRU5ERVJTID0gJ2JveSBnaXJsJy5zcGxpdCgpCkRBWVMgPSAnbW9uIHR1ZSB3ZWQgdGh1IGZyaSBzYXQgc3VuJy5zcGxpdCgpCgpkZWYgaGFzX3R3b19ib3lzKChjaGlsZDEsIGNoaWxkMikpOgogICAgI0RvIHlvdSBoYXZlIHR3byBib3lzPwogICAgcmV0dXJuIGNoaWxkMVswXSA9PSAnYm95JyBhbmQgY2hpbGQyWzBdID09ICdib3knCgpkZWYgcXVlc3Rpb24oY2hpbGQpOgogICAgI0lzIHRoaXMgY2hpbGQgYSBib3kgYm9ybiBvbiBhIHR1ZXNkYXk/CiAgICByZXR1cm4gY2hpbGQgPT0gKCdib3knLCAndHVlJykKCmRlZiBzaG93X3Byb2JhYmlsaXR5KHBhaXJzKToKICAgIG5yX2JveV9wYWlycyA9IGxlbihmaWx0ZXIoaGFzX3R3b19ib3lzLCBwYWlycykpCiAgICBwcmludCAnJWQgcGFpcnMsIHdoZXJlICVkIGFyZSBib3kgcGFpcnMnICUgKGxlbihwYWlycyksIG5yX2JveV9wYWlycykKICAgIHByaW50ICdnaXZlcycsIGZyYWN0aW9ucy5GcmFjdGlvbihucl9ib3lfcGFpcnMsIGxlbihwYWlycykpCiAgICBwcmludAogICAgCkNISUxEX1RZUEVTID0gbGlzdChpdGVydG9vbHMucHJvZHVjdChHRU5ERVJTLCBEQVlTKSkKI0FsbCB0aGVzZSBwYWlycyBhcmUgZXF1YWxseSBjb21tb24KIyhpZiB3ZSBwcmV0ZW5kIHRoYXQgZWFjaCBkYXkgYW5kIGdlbmRlciBpcyBlcXVhbGx5IGxpa2VseSBmb3IgZWFjaCBiaXJ0aCk6CkFMTF9DSElMRF9QQUlSUyA9IGxpc3QoaXRlcnRvb2xzLnByb2R1Y3QoQ0hJTERfVFlQRVMsIENISUxEX1RZUEVTKSkKCnByaW50ICdQcm9iYWJpbGl0eSB0aGF0IGEgcGVyc29uIGhhcyB0d28gYm95czonCnNob3dfcHJvYmFiaWxpdHkoQUxMX0NISUxEX1BBSVJTKQoKI05vdyB3ZSBhc2sgYWxsIHBhcmVudHMgdGhlIHF1ZXN0aW9uCllFU19QQVJFTlRTID0gW3BhaXIgZm9yIHBhaXIgaW4gQUxMX0NISUxEX1BBSVJTCiAgICAgICAgICAgICAgICNJcyBhbnkgb2YgeW91ciBjaGlsZHJlbiBhIGJveSBib3JuIG9uIGEgdHVlc2RheT8KICAgICAgICAgICAgICAgaWYgcXVlc3Rpb24ocGFpclswXSkgb3IgcXVlc3Rpb24ocGFpclsxXSldCgpwcmludCAnUHJvYmFiaWxpdHkgdGhhdCBhIHBlcnNvbiBoYXMgdHdvIGJveXMsIGdpdmVuIHRoYXQgdGhleSBhbnN3ZXIgeWVzOicKc2hvd19wcm9iYWJpbGl0eShZRVNfUEFSRU5UUykK

Success #stdin #stdout 0.08s 12432KB

comments (?)

stdout
Probability that a person has two boys:
196 pairs, where 49 are boy pairs
gives 1/4

Probability that a person has two boys, given that they answer yes:
27 pairs, where 13 are boy pairs
gives 13/27