Simulation of statistic riddle
I have two children. One is a boy born on a Tuesday. What is the probability I have two boys?
You can read the article with the riddle here: Hype about conditional probability puzzles
The riddle was also mentioned this week on SPON: DE Das Geschwister-Problem
As normal there is a lot of discussion in the article comments about the solution 13/27.
So just proof the solution with a simulation.
- Create 1.000.000 families with two children {m,f} 50:50 and born on {sa,su,mo,tu,we,th,fr} 1:7
- Count chance, that family has two boys 1/4
- Count chance, that family has two boys, if you know that one child is a boy 1/3
- Count chance, that family has two boys, if you know that one child is a boy and born on tuesday 13/27
If you program it, it is obvious, that each additional information (one child is a boy, one child is a boy born on tuesday) changes the sample for the probability calculation.
Simple ABAP program
CONSTANTS:
c_female TYPE i VALUE 0,
c_male TYPE i VALUE 1,
c_saturday TYPE i VALUE 0,
c_sunday TYPE i VALUE 1,
c_monday TYPE i VALUE 2,
c_tuesday TYPE i VALUE 3,
c_wednesday TYPE i VALUE 4,
c_thursday TYPE i VALUE 5,
c_friday TYPE i VALUE 6.
TYPES:
BEGIN OF ys_family,
child1_gender TYPE i,
child1_day_of_the_week TYPE i,
child2_gender TYPE i,
child2_day_of_the_week TYPE i,
END OF ys_family.
DATA:
lo_rnd TYPE REF TO cl_random_number,
ls_family TYPE ys_family,
lt_family TYPE TABLE OF ys_family,
li_won TYPE i,
li_lost TYPE i,
li_total TYPE i.
CREATE OBJECT lo_rnd.
CALL METHOD lo_rnd->if_random_number~init.
DO 1000000 TIMES.
ls_family-child1_gender = lo_rnd->if_random_number~get_random_int( 1 ).
ls_family-child1_day_of_the_week = lo_rnd->if_random_number~get_random_int( 6 ).
ls_family-child2_gender = lo_rnd->if_random_number~get_random_int( 1 ).
ls_family-child2_day_of_the_week = lo_rnd->if_random_number~get_random_int( 6 ).
APPEND ls_family TO lt_family.
ENDDO.
WRITE: / 'Chance to have two male children'.
CLEAR: li_won, li_lost.
LOOP AT lt_family INTO ls_family.
ADD 1 TO li_total.
IF ls_family-child1_gender EQ c_male AND
ls_family-child2_gender EQ c_male.
ADD 1 TO li_won.
ELSE.
ADD 1 TO li_lost.
ENDIF.
ENDLOOP.
WRITE: / 'total', li_total, 'Won:', li_won, 'Lost:', li_lost.
li_won = li_won * 100 / li_total.
li_lost = li_lost * 100 / li_total.
li_total = li_total * 100 / li_total.
WRITE: / 'total', li_total, '%', 'Won:', li_won, '%', 'Lost:', li_lost, '%'.
ULINE.
WRITE: / 'Chance to have two male children, if you know that first child is male'.
CLEAR: li_won, li_lost.
LOOP AT lt_family INTO ls_family.
IF ls_family-child1_gender EQ c_male OR
ls_family-child2_gender EQ c_male.
ADD 1 TO li_total.
IF ls_family-child1_gender EQ c_male AND
ls_family-child2_gender EQ c_male.
ADD 1 TO li_won.
ELSE.
ADD 1 TO li_lost.
ENDIF.
ENDIF.
ENDLOOP.
WRITE: / 'total', li_total, 'Won:', li_won, 'Lost:', li_lost.
li_won = li_won * 100 / li_total.
li_lost = li_lost * 100 / li_total.
li_total = li_total * 100 / li_total.
WRITE: / 'total', li_total, '%', 'Won:', li_won, '%', 'Lost:', li_lost, '%'.
ULINE.
WRITE: / 'Chance to have two male children, if you know that first child is male and born on tuesday'.
CLEAR: li_won, li_lost.
LOOP AT lt_family INTO ls_family.
IF ls_family-child1_gender EQ c_male OR
ls_family-child2_gender EQ c_male.
IF ( ls_family-child1_gender EQ c_male AND
ls_family-child1_day_of_the_week EQ c_tuesday ) OR
( ls_family-child2_gender EQ c_male AND
ls_family-child2_day_of_the_week EQ c_tuesday ).
ADD 1 TO li_total.
IF ls_family-child1_gender EQ c_male AND
ls_family-child2_gender EQ c_male.
ADD 1 TO li_won.
ELSE.
ADD 1 TO li_lost.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
WRITE: / 'total', li_total, 'Won:', li_won, 'Lost:', li_lost.
li_won = li_won * 100 / li_total.
li_lost = li_lost * 100 / li_total.
li_total = li_total * 100 / li_total.
WRITE: / 'total', li_total, '%', 'Won:', li_won, '%', 'Lost:', li_lost, '%'.
Output example
Chance to have two male children total 1.000.000 Won: 250.442 Lost: 749.558 total 100 % Won: 25 % Lost: 75 % Chance to have two male children, if you know that first child is male total 750.485 Won: 250.442 Lost: 499.943 total 100 % Won: 33 % Lost: 67 % Chance to have two male children, if you know that first child is male and born on Tuesday total 138.231 Won: 66.430 Lost: 71.701 total 100 % Won: 48 % Lost: 52 %
Now do Monty Hall. As an additional challenge, use the Strategy Pattern.
Hm, there is not so much logic to implement, if you want to reuse the same simulation from the starting problem.
It is just another win condition 'I give you two boxes, if you give me your box back.', but no filter on the opened box by the moderator.
Output
Code
I have to say that the win would be if it was a girl.. 😉 Of course ask any parent and the win is if they had a health, happy baby. I had to add that.
Very cool blog - I liked it!
Michelle