FileMakerでモンティ・ホール問題
はじめに
FileMaker使ってまた何やってんだアンタ、って怒られそうなネタで恐縮です。今回はモンティ・ホール問題っていうのを扱ってみたいと思います。実務に役立つtipsを出せって?それはもっと賢人にお任せしてですね...
モンティ・ホール問題、ご存じの方もいらっしゃるかもしれませんね。確率に関する問題の一つです。確率っていうのは...ぇぇと例えば目の前に3人の美女が居てですね、内1人はアナタのことが大好きで他2人はアナタのことが大嫌いです。でもアナタにはそのことは分かりません。アナタが3人の内の1人に告白した時、付き合えることをどれだけ期待しちゃっていいのかなぁ...っていう...まぁだいたいそんな感じのヤツです。
分かります?だいたい分かりますよね、つまりHappy具合です。
本題
改めてモンティ・ホール問題、確率の問題なのは確かにそうなんですが、導き出された答えが直感の答えと異なることからパラドックスとも言われています。1990年当時、この問題で全米が大荒れに荒れたそうです、ヒェッ。
まずは、モンティ・ホール問題とは何かを、FileMaker使いのみなさんに分かり易く、FileMaker用語を使って説明しますと、
- レイアウト上にテキストフィールドが3つ、それに対応したボタンが3つがあります
- そのフィールド3つの内、1つに「Claris」2つに「kintone」と、CPUが文字を設定しています
- でも、実際は3つの文字色がフィールド背景と同じ為、何が書いてあるかは分かりません
- 3つのボタンの内1つを押すと、押さなかったボタン2つに対応するフィールドの内、必ず「kintone」と記載されたフィールドを文字色を変えてCPUが教えてくれます
- その後FinalAnswerの為に、ボタンの選択を変えて押すことも、そのまま同じボタンを押すことも出来きますが、「Claris」を引き当てる為にはボタンの選択を変えた方が良いか?
という問題です。
え?選択は変えても変えなくても一緒じゃないの?
みなさんが大好きな崇拝する「Claris」を選べる確率は、3つの内1つなので、
そりゃそうでしょ?っていう。それはどうなっても変わらないんじゃないの?って普通思いますよねぇ。3つの内1つにしかClaris様は居ないんですから。あ、ちなにみ私は崇拝してません。
でも、ところが!です。
先程の4.でCPUが「kintone」のフィールドを暴露してくれた後に、5.で選択を変えた方が「Claris」に当たり易くなるんです。え?アンタそれ本気で言ってる?っていうね。
なので、パラドックスと言われる所以です。
論理的な解と直感の解の剥離。
「don't think! feel.」ってある映画俳優が言ってましたが、考えなきゃダメな時もあるんです。
実際にやってみた
demo
というテーブルに、フィールドを6つ用意します。
-
field1~field3
:「Claris」「kintone」のテキスト設定用 -
currentNum
:正解数をカウントして表示する用 -
totalNum
:試行回数を表示する用 -
probability
:確率を表示する用
用意が出来たら、レイアウトにこんな感じで一旦配置します。それぞれのフィールドの下に、対応するボタンも設置します。
黒色以外なら何色でも構わないんですが、フィールドの文字色をフィールド背景色と同じようにするのを忘れないで下さい。違っていたら解答丸見えで意味がありません。不正イクナイ。
スクリプトを組んでみる
処理としては、
- CPUがランダムにフィールドに文字を設定
- ユーザーが3つの内どれかのボタンを押すと、CPUがユーザーの押していないボタンに対応する必ずハズレのフィールドをオープン(文字色変更)
- ユーザーがボタンを変更するしないに関わらず、再度押されたら全フィールドオープン(文字色変更)して、正解率を計算
取り敢えずこれだけです。
CPUがランダムに正解を設定するスクリプト
とくにややこしい箇所はありませんが、ランダム設定スクリプトset.answer
-
$$correct.FieldNum
:1~3からランダムに選ぶ正解のフィールド番号 -
$incorrect.FieldNums
:不正解のフィールド番号達
ポイントとしては、正解番号は後に使用する為にg変数$$correct.FieldNum
とする点ですね。
7行目で$incorrect.FieldNums
を設定する際、3つの番号しかないのでベタ打ちで取得するようにしています。数十個のフィールドでやりたい場合は、改行区切りを保持させておくとかして処理する必要があります。
ボタンを押した時のスクリプト
スクリプトを少なくしたかったのでやや長いですが、ボタンに設定するスクリプトclick.btn
1行目:後にレイアウトで設定しますが、ボタンに設定した1~3の番号を取得
3行目:1回目に押した際と2回目に押した際で分岐
5行目:ユーザー選択番号と正解の番号を除外し、つまり100%ハズレ番号達を$rest.num
に設定
Substitute ( "123" ;
[ $click.num ; "" ];
[ $$correct.FieldNum ; "" ]
)
補足すると、$click.num
と$$correct.FieldNum
が一致していた場合、つまり1回目に選択したボタンが実は正解だった場合、$rest.num
には2つの番号が残ります。
7行目:その$rest.num
の中からCPUがランダムに番号を選択し、$cpu.select.num
に設定
Let (
[
~posi = Int ( Random * Length ( $rest.num ) ) + 1
];
Middle ( $rest.num ; ~posi ; 1 )
)
9行目:$cpu.select.num
を元に、フィールドを名前で設定
を使ってその番号フィールドの文字色を黒に変更(暴露タイム)
TextColor (
Evaluate ( "demo::field" & $cpu.select.num ) ; RGB ( 0 ; 0 ; 0 )
)
15行目以降は、2回目にボタンを押した時の処理なので、ややこしくはありません。しいて言えば、31,32行目で正解発表後に続行できるように、set.answer
を再度呼び出しているところでしょうか。
オブジェクトの設定
レイアウトに戻り、各ボタンに設定を行います。
click.btn
を設定しますが、引数はそれぞれのフィールド番号です。field1のボタンは「1」を、field2のボタンは「2」を設定します。
また、1回目のボタンを押した後にCPUがハズレを暴露してくれますが、2回目にボタンを押す際、暴露されたフィールドのボタンを間違って押さないように細工します。
暴露(文字色が黒に)されたら、そのボタンを隠します。フィールドの完全修飾名に注意して下さい。図は、field3に対応するボタンに設定している様子です。
準備ヨシ
ここまで出来たら、レイアウトモードに戻り、
set.answer
を一度実行して準備完了です。存分にお楽しみください。
実際の様子
まず、2度目のボタン選択を変更しなかった場合、20回試行
Claris様を拝める確率は・・・30%、まぁそうやろね。
次に、2度目のボタン選択で変更した場合、同じく20回試行
Claris様を拝める確率は・・・なん・・・だと!?75%だと!?
おわりに
いかがだったでしょうか。
全米を震撼させただけあるモンティ・ホール問題は、実際に試行実験をしてみると確かに震撼しましたね。試行回数は本当はもっと上げないといけません。1,000回くらい行うと、2度目にボタン選択を変更する場合が、だいたい66%くらいの確率に落ち着く感じです。変更しなかった場合に比べ実に2倍です。
1,000回試行とか手動押しでは発狂し廃人になりますので、自動化スクリプトを組むのがおススメです。レイアウトの設定とかも要らず、純粋にスクリプトを回すだけのパワープレイで済みますのでお手軽ですよ。また機会があれば、その辺りも公開できたらと思います。
では最後に、100,000回自動試行(2回目ボタン選択変更パターン)した際の結果を貼って〆
それでは
Let's enjoy FileMaker!
Discussion