ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

2人の子供問題のパラドックスを利用したギャンブル

前提条件

A「ある家庭に2人の子供がいて、1人が男の子の場合、もう1人の子が女の子である確率は?」

B「ある家庭で男の子が生まれる確率と女の子が生まれる確率はそれぞれ1/2ずつで考えていい?」

A「いいよ」

B「うーん。もう1人の子が男の子か女の子かは独立だから、1/2じゃない?」

A「残念。ある家庭に2人の子供がいる場合の(年上, 年下)のペアは(男, 男)、(男, 女)、(女, 男)、(女, 女)の4通りで、1人が男の子で確定したときに(女, 女)は除外される。だから残りの3通りのうち、もう1人が女の子のパターンは(男, 女)、(女, 男)の2通りだから答えは2/3だよ」

B「なるほどなぁ」

ギャンブルに持ち込む

A「よし、今の2人の子供の問題と同じ状況を再現して賭けをしようよ」

B「どんな賭け?」

A「僕は2枚のコインを同時に投げる。1枚のコインはみんなに見えるように。もう1枚のコインは表か裏どちらが出たのか僕も君もわからないようにする。」

B「それで?」

A「見えてるコインが表になったときに賭けは始まるんだ。『見えてないコインがであるか賭けてください』って。裏だったら君の勝ち。そうじゃなかったら僕の勝ちだ。さっきの2人の子供と同じ状況だから、見えてないコインが裏の確率は2/3だよね?」

B「そうかも

A「見えてるコインが裏になったときはコインを投げ直すよ」

B「まあいいでしょう」

A「当たったときの賞金は僕が1000円出す。当たる確率が2/3だから賞金の期待値は666円だね。参加費は1回600円でどう?これは君にバチクソ有利な賭けだよ」

B「やろうやろう」

# coding: utf-8
import random

entry_fee = 600 # 参加費
prize = 1000 # 賞金
bet_num = 0 # 賭けを行った回数
iter_max = 1000 # コインを投げた回数
win_b = 0 # B君が勝った回数

for i in range(iter_max):
    seen = random.randrange(2) # 見えているコイン(0:表, 1:裏)
    unseen = random.randrange(2) # 見えてないコイン(0:表, 1:裏)
    if seen==0:
        # 見えてるコインが表になったら賭けをする
        bet_num += 1
        if unseen==1:
            # 見えてないコインが裏だった場合、B君の勝ち
            win_b += 1

print("賭けを行った回数: {}".format(bet_num))
print("B君の勝率: {}".format(win_b/bet_num))
print("B君が払った参加費の合計: {}".format(entry_fee*bet_num))
print("B君が貰った賞金の合計: {}".format(prize*win_b))
print("B君の収支: {}".format(prize*win_b - entry_fee*bet_num))
賭けを行った回数: 524
B君の勝率: 0.5305343511450382
B君が払った参加費の合計: 314400
B君が貰った賞金の合計: 278000
B君の収支: -36400

1時間後

B「3万円も負けちゃった」

A「そういうときもあるよ」

B「わかった。見えてるコインが裏になったときにコインを投げ直しているのがイカサマだ。試行をごまかそうとしたね?」

A「じゃあ見えているコインが裏になったときも賭けをしよう。そのときは『見えてないコインがであるか賭けてください』だね。表だったら君の勝ち。そうじゃなかったら僕の勝ちだ。これは見えているコインが表のときと同じ賭けだから問題ないよね?」

B「それならいいかも」

A「じゃあ続けるよ」

# coding: utf-8
import random

entry_fee = 600 # 参加費
prize = 1000 # 賞金
bet_num = 0 # 賭けを行った回数
iter_max = 1000 # コインを投げた回数
win_b = 0 # B君が勝った回数

for i in range(iter_max):
    seen = random.randrange(2) # 見えているコイン(0:表, 1:裏)
    unseen = random.randrange(2) # 見えてないコイン(0:表, 1:裏)
    if seen==0:
        # 見えてるコインが表になったら賭けをする
        bet_num += 1
        if unseen==1:
            # 見えてないコインが裏だった場合、B君の勝ち
            win_b += 1
    # 【追加】
    elif seen==1:
        # 見えてるコインが裏になったときも賭けをする
        bet_num += 1
        if unseen==0:
            # 見えてないコインが表だった場合、B君の勝ち
            win_b += 1

print("賭けを行った回数: {}".format(bet_num))
print("B君の勝率: {}".format(win_b/bet_num))
print("B君が払った参加費の合計: {}".format(entry_fee*bet_num))
print("B君が貰った賞金の合計: {}".format(prize*win_b))
print("B君の収支: {}".format(prize*win_b - entry_fee*bet_num))
賭けを行った回数: 1000
B君の勝率: 0.512
B君が払った参加費の合計: 600000
B君が貰った賞金の合計: 512000
B君の収支: -88000

さらに1時間後

B「なるほど、ひとつだけわかったことがある」

A「それはなに?」

B「君との友情はもう壊れたってこと」

A「😅トホホ・・・」

解説

  • 2人の子供問題のパラドックスの本質は、「確率は1/2ではなく、実は確率は2/3でした」というより、「問題文が曖昧なので1/2と解釈することも2/3と解釈することもできる」点にあるだろう
  • その曖昧さを利用して、相手に「実は確率は2/3」であることを納得させる
  • あとは似て非なる「本当の確率は1/2」のギャンブルに持ち込み、ボロ儲けする

B君がやるべきだったギャンブル

# coding: utf-8
import random

entry_fee = 600 # 参加費
prize = 1000 # 賞金
bet_num = 0 # 賭けを行った回数
iter_max = 1000 # 家庭を訪問する回数
win = 0 # B君が勝った回数

for i in range(iter_max):
    pair = random.randrange(4) # ある家庭の2人の子供の(年上,年下)のペア: 0:(男,男),1:(男,女),2:(女,男),3:(女,女)
    if pair!=3:
        # 少なくとも1人が男と判明した場合、賭けが始まる
        bet_num += 1
        if pair!=0:
            # (男,女),(女,男)の場合は、B君の勝ち
            win += 1

print("賭けを行った回数: {}".format(bet_num))
print("B君の勝率: {}".format(win/bet_num))
print("B君が払った参加費の合計: {}".format(entry_fee*bet_num))
print("B君が貰った賞金の合計: {}".format(prize*win))
print("B君の収支: {}".format(prize*win - entry_fee*bet_num))
賭けを行った回数: 748
B君の勝率: 0.6644385026737968
B君が払った参加費の合計: 448800
B君が貰った賞金の合計: 497000
B君の収支: 48200