システムとモデリング

SysML, Matlab/Simulink,他モデリング全般について。たまにプロジェクトマネジメント。

カイジ「救出」ゲームの勝率を計算してみた

こんばんは!Otepipiです。今回は賭博堕天録カイジ和也編「救出」ゲームをMatlab上でシミュレーションし、ゲームの勝率を計算します。

 

 

ルールのおさらい

 

f:id:Otepipi:20180104202512p:plain

救出ゲーム

多少デフォルメしたルールの要点は下記になります。

  1. 三山氏、マリオ、チャンのうち誰かの頭上のランプが点灯する(=点灯した人が"救出者"、他2名は"人質")。本人は自分のランプの点灯状況はわからない。
  2. タイマーがonし、60秒のカウントダウンがはじまる。(タイマーの時間はわからない)
  3. "救出者"60秒以内にボタンを押すと、タイマー停止し、クリア。逆に間違って"人質"がボタンを教えてしまうとゲーム失敗(=死亡)となる。
  4. タイマーがonしてから30秒経過していない時にボタンを押した場合も失敗となる。

一見簡単そうに見えますが、実際は一筋縄ではいかないようです。例えば最下段の「チャン」が"救出者"となった場合、「チャン」が自分を"救出者"として自覚しボタンを押すには下記の思考プロセスが必要になります。

  1. 三山氏のランプが点灯している場合、チャン・マリオのランプは点灯していないため、三山氏は自分のランプが点灯していると気付くはず。(三山氏からはマリオ・チャンのランプ点灯状況が視認できるので)
  2. 三山氏がボタンを押していない(=タイマーがストップしていない)ということは、マリオかチャンのどちらかのランプが点灯している
  3. この状況で仮にチャンのランプが点灯していない場合、マリオは視認して自分が"救出者"だと判断でき、ボタンを押すはずである。
  4. マリオがボタンを押していないということは、チャンのランプが点灯している

詳しいルールについては下記サイトが参考になります。

賭博堕天録カイジ 和也編 友情確認ゲーム「救出」 ルール カイジの勝負 ギャンブルのルール

 

救出者の振る舞い 

f:id:Otepipi:20180108190948p:plain

上の画像は今回のシステムの振る舞いを表すSysMLのアクティビティ図です。
ゲームクリアのため、各"救出者"がどのように振る舞えば良いのか軽くまとめます。

三山氏が救出者の場合

三山氏が"救出者(=頭上のランプが点灯)"の場合、下2名のランプは点灯していないので三山氏はすぐに自分が"救出者"だとわかります。したがって、三山氏は30秒経過したらボタンを押すことを考えてれば良いです。しかし、30秒経つ前にボタンを押したら失敗となります。

マリオが救出者の場合

マリオが救出者の自覚を得るには①三山氏が救出者でないという確信②チャンの頭上ランプが点灯していないこと の2条件が必要です。②については視認することですぐにわかるはずで、問題は①です。これについては「三山氏が救出者なら30秒経ったらボタンを押すはず」と考えることができますので、例えば約40秒経過したなら三山氏が救出者ではないと確信し、ボタンを押すことができます。

チャンが救出者の場合

マリオが救出者の自覚を得るには①三山氏・マリオの両名が救出者でないという確信が必要です。これについてはマリオの時と同様に「三山氏が救出者なら30秒経ったらボタンを押すはず」「マリオが救出者なら約40秒経ったらボタンを押すはず」と考えることができますので、例えば約50秒経過したなら三山氏が救出者ではないと確信し、ボタンを押すことができます。

シミュレーションをする上での仮定

シミュレーションする上ではまだ未知数が多いので、仮定を置く必要があります。ここで未知な点は

  • 各救出者はそれぞれ(自分の時間感覚で)何秒経過したらボタンを押すのか
  • 人の時間感覚は、真の値とどれくらいズレるのか

です。

ここで、各救出者のボタンを押す時間は下記に設定することにします。
三山氏………36秒
マリオ………44秒
チャン………52秒
(設定根拠)「30秒より前にボタンを押しては行けない」というルールがあるので三山氏が押す時間は36秒と、30秒から多少余裕をとりました。60秒-36秒=24秒で、これを三等分すると8秒なので、これをマリオ・チャンに分配しました。

また、人の時間感覚と真の値のズレですが、例えば『1秒』を人の感覚で測定する場合「平均1秒、分散0.2秒で正規分布する」と仮定しました。これを100万回試行したヒストグラムにすると下のようなグラフになります。

f:id:Otepipi:20180108193341p:plain

誤差が大きすぎるような気がしますね!ただ、ある程度真の値とのズレがないとゲームの成功率が高くなりすぎてしまうので、命がかかったゲームで緊張しているという設定でこのくらいにしておきたいと思います。

シミュレーションの方法

Matlabスクリプトを書いて実行しました。


1回の試行でランダムに救出者が決定され、救出者が一番早くボタンを押す(ただし30秒より後で)ことができればゲームクリア。人質の方が早く押してしまったり30秒経たない内に押してしまった場合は失敗

………という試行を10万回繰り返して、ゲームクリア回数を測定しました。

 

結果

10万回試行した時のゲームクリア回数は

約9万7千5百回

確率にして成功率97.5%と高い勝率でした。

また残り2千5百回の失敗は、誰が"救出者"の時だったのかを示したのが下のグラフです。

f:id:Otepipi:20180108195754p:plain

マリオが"救出者"だったときに失敗したのが大半でした!これは「三山より遅く、チャンより早く」ボタンを押す必要があったため3人の中では一番シビアだったのではと思います。このあたりの配分は各人の『ボタンを押す時間』をいじってやれば変わるとは思います。

最後に、カイジ本編ではこのゲームを16回連続でクリアすると1億円超の報酬が貰えます。今回のシミュレーションで、その確率は97.5%^16=66.7%だと推定できます。カイジに出てくるゲームの中ではかなり割の良いゲームなのかもしれませんね。