今回も他人様の動画をネタにしています。いわゆる「ギャンブラーの誤謬」ですね。

ガチャ確率1%であれば100回やれば当たる?

ガチャ確率1%であれば100回やれば当たるのではないか? これは数学的に考えると当たるとは限りません。数学的に証明することは可能ですが、ここはプログラミングで検証してみましょう。前提として一度引いたくじは箱に戻します。そうしないと100個あるくじを100回引いたら絶対に当たるのは自明なので・・・。

まずくじのクラスを作成します。

そしてくじを100個つくり、そのなかのひとつだけを「当たり」にします。

そして100回くじをひきます。当たったらその回数を記録して戻り値として返します。

そしてこの操作を10000回繰り返して、的中率を調べます。

この場合は100%前後の値が表示されます。

では最低1回は的中する確率は?となるとどうでしょうか?

実験してみると63%台になります。100回くじを引けば複数回的中することもあるし、1回も的中しないこともあります。これを平均すると1/100なのです。「100回引けば必ず1回は的中する」とはなりません。約37%の確率で1回も的中しない場合もあるのです。

モンティ・ホール問題

さて、

この動画のコメントに

「直感と実際の確率が合わないケースとして特に有名なのがモンティ・ホール問題ですよね」

というのがありました。

モンティ・ホール問題 – Wikipedia

プレーヤーの前に閉じた3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろには、はずれを意味するヤギがいる。プレーヤーは新車のドアを当てると新車がもらえる。プレーヤーが1つのドアを選択した後、司会のモンティが残りのドアのうちヤギがいるドアを開けてヤギを見せる。

ここでプレーヤーは、最初に選んだドアを、残っている開けられていないドアに変更してもよいと言われる。
ここでプレーヤーはドアを変更すべきだろうか?

これを見たとき、変更しても変更しなくても同じではないのか?

そのように思いました。ところが実際にはそうではありません。変更すべきです。変更することで的中率が2倍にアップします。

これも実際にプログラミングをして実験してみましょう。

まずくじを3つ作りましょう。そしてどれかひとつを当たりにしましょう。

このなかからランダムにくじをひきます。そして引かれなかったくじのなかには1つ、または2つのハズレくじがあります。1つしかない場合はそのくじを、2つある場合はそのなかからランダムにひとつ選んで取り除きます。これで引かれなかったくじは1つだけになります。

Drawlotメソッドの引数 doesChange はtrueなら交換する、falseなら交換しないを意味しています。最終的に選んだくじが当たりかどうかしらべて当たりならtrue、そうでなならfalseを返します。

あとはDrawlot(doesChange)メソッドを何回か繰り返して的中率を調べます。10,000回やれば充分だと考えます。

あとはDrawlotsメソッドの引数をtrueとfalseにして違いを調べるだけです。

実験してみると引数falseなら33%前後、引数trueなら66%前後になり、両者には2倍の違いがあることがわかります。

なぜこんなことになるのでしょうか?

それは最初に当たりを選ぶと交換した場合、ハズレになります。最初にハズレを選ぶと交換することで最終的に当たりになります。ということは最初に当たりならハズレ、ハズレなら当たりです。

では最初に当たりとハズレを引く確率はどうなっているのでしょうか? ハズレを引く確率は2/3、当たりを引いてしまう確率は1/3です。だから交換することで最終的に当たりになる確率は2/3に上昇するのです。