チンチロリンハイボール問題を無意味にPythonで解く

さて

Yahoo!ニュースで目にしたこの話題

bylines.news.yahoo.co.jp

一方、昨日のことでありますが、オフィス近所の初めて入った食堂でランチを喰っていたところ、以下のようなプロモーションを見かけ、改めて「ギャンブルに関するリスク教育」の必要性を感じた次第です。

として、筆者が例示していたのがサイコロを2つ振って、出た目に応じてハイボールの値段を無料・半額・倍額にするというゲーム。

合計がゾロ目なら無料
合計が偶数なら半額
合計が奇数なら倍額

と言うルールで、これは客が損するよねと言うお話し。

敢えてPythonで解く

元記事にも計算が書いてあるが、この問題を敢えて無意味にPythonで解いてみる。組んだプログラムは以下の通り。

HiBall = 0
for i in range (1,7):
    for j in range (1,7):
        if i == j:
            HiBall = HiBall
        elif (i + j)%2 == 0:
            HiBall = HiBall + 175
        else:
            HiBall = HiBall + 700
print HiBall/36

2つのサイコロの出目の合計を全て検証し、ハイボールの価格の期待値を求めている。ハイボールの値段は元記事と同じく350円と設定してある。

出てきた答えは408円であり、明らかに客側が損する仕組みになっている(元記事の通り)。

というか全てのギャンブルの期待値は1以下なのは自明(そうでないと胴元が儲からない)なので、ギャンブルをすること自体がリスクだと思っている。

追記:値段も量も倍の場合

id:fatmongerさん、id:mobile_nekoさん、id:nanjodemoさん、id:senriiiiiさん、id:sugatareijiさんらから、値段が倍の時は量も倍にしているとの指摘を頂いた(元の記事でも一般的には倍額倍量のところ、筆者が訪れた店は倍額等量だったので損だと指摘している)。

つまり、

合計がゾロ目なら無料
合計が偶数なら半額
合計が奇数なら倍額で、倍量

この場合は直感的に損がないように思えるが、この条件でプログラムを組み直してみると。

HiBall = 0
Glass = 0
for i in range (1,7):
    for j in range (1,7):
        if i == j:
            HiBall = HiBall
            Glass += 1
        elif (i + j)%2 == 0:
            HiBall = HiBall + 175
            Glass += 1
        else:
            HiBall = HiBall + 700
            Glass += 2
print HiBall/Glass
print Glass/36.0

一杯あたりの期待値は272円となり、客の側から見るとかなりお得感が出てきた。だいたい8割がけの値段になっている。

ではお店の立場では損がないのかと考えてみると。実は1回の注文あたり1.5杯分の注文が期待される計算になるのだ。1杯あたりの単価は安くなるものの、その分1.5倍売れれば丸儲けだよね。

もともとハイボール原価なんてタダみたいなもんだろうし。

と言うわけで、このチンチロリンキャンペーンを考えた人は頭が良いなと思った次第。

では