パズル万華鏡

面白いパズルの紹介と解説をします。

男女の確率問題(5)の解

 男女の確率問題(5)の解答例を示します。


(5)の解
f:id:isemba:20151227112218j:plain

(考察)

 「3人の子供は、『男が3人』『男が2人、女が1人』『男が1人、女が2人』
『女が3人』の4通りなので、それぞれの確率は、1/4である」という議論は、間違っている。
プログラムでシミュレーションをしてみると、このような間違いに気づくことが多い。

 問題(5)のシミュレーションを行うプログラムを書き、実行した。

●プログラム(BG511.bas)

' << BG511.bas >>
' Tiny Basic
' 問題(5)のシミュレーション
'
Dim A(3): ' 男女の状態を表す配列。
          ' A(1)=0:1番目が男の場合。
          ' A(1)=1:1番目が女の場合。
          ' A(2)=0:2番目が男の場合。
          ' A(2)=1:2番目が女の場合。
          ' A(3)=0:3番目が男の場合。
          ' A(3)=1:3番目が女の場合。
Dim B(7): ' 3人の子どもの状態を表す配列。
          ' B(0):1番目が男、2番目が男、3番目が男の場合の数。
          ' B(1):1番目が女、2番目が男、3番目が男の場合の数。
          ' B(2):1番目が男、2番目が女、3番目が男の場合の数。
          ' B(3):1番目が女、2番目が女、3番目が男の場合の数。
          ' B(4):1番目が男、2番目が男、3番目が女の場合の数。
          ' B(5):1番目が女、2番目が男、3番目が女の場合の数。
          ' B(6):1番目が男、2番目が女、3番目が女の場合の数。
          ' B(7):1番目が女、2番目が女、3番目が女の場合の数。
'
Do
  ' 実験回数NMAXを読み込む。
  Read NMAX
  If NMAX <= 0 Then Exit Do
  '
  ' 初期設定。
  Randomize 123: ' 乱数の初期設定。
  For K=0 to 7: B(K)=0: Next K
  '
  ' NMAX回実験を繰り返す。
  For N=1 To NMAX
    ' 1番目の子供の判定。
    ' 1番目の子供の男女の出生割合を、1:1と考える。
    ' 1番目が男ならA(1)=0、女ならA(1)=1。
    If Rnd < 0.5 Then A(1)=0 Else A(1)=1
    ' 2番目の子供の判定。
    ' 2番目の子供の男女の出生割合を、1:1と考える。
    ' 2番目が男ならA(2)=0、女ならA(2)=1。
    If Rnd < 0.5 Then A(2)=0 Else A(2)=1
    ' 3番目の子供の判定。
    ' 3番目の子供の男女の出生割合を、1:1と考える。
    ' 3番目が男ならA(3)=0、女ならA(3)=1。
    If Rnd < 0.5 Then A(3)=0 Else A(3)=1
    '
    ' 配列Bに記録する。
    ' A(1)=0,A(2)=0,A(3)=0 のとき、K=0
    ' A(1)=1,A(2)=0,A(3)=0 のとき、K=1
    ' A(1)=0,A(2)=1,A(3)=0 のとき、K=2
    ' A(1)=1,A(2)=1,A(3)=0 のとき、K=3
    ' A(1)=0,A(2)=0,A(3)=1 のとき、K=4
    ' A(1)=1,A(2)=0,A(3)=1 のとき、K=5
    ' A(1)=0,A(2)=1,A(3)=1 のとき、K=6
    ' A(1)=1,A(2)=1,A(3)=1 のとき、K=7
    K=A(1)+2*A(2)+4*A(3)
    B(K)=B(K)+1
  Next N
  '
  ' 実験結果の表示。
  Print"実験回数:";NMAX
  Print Using"男の子が3人となる確率:#.###";B(0)/NMAX
  Print"男の子が2人、女の子が1人である確率:";
  Print Using"#.###";(B(3)+B(5)+B(6))/NMAX
  Print"男の子が1人、女の子が2人である確率:";
  Print Using"#.###";(B(1)+B(2)+B(4))/NMAX
  Print Using"女の子が3人となる確率:#.###";B(7)/NMAX
  Print
Loop
End
'
' データ。
Data 1000, 10000, 100000, 1000000, 0

実行結果
f:id:isemba:20151227112359j:plain
f:id:isemba:20151227112412j:plain