パスワードを忘れた? アカウント作成
172834 journal

gm300の日記: 3人の囚人。 2

日記 by gm300
めんどうなんでプログラムで。オイラが普段使う言語はマイナーっぽいので、ここはjavascritp。

基本コンセプトはこう。
誰が恩赦になるか乱数を使って選ぶ。オイラの技量では乱数からA,B,C に一気にマップできないので、0,1,2 という数字で代用。本質じゃないし。
1が恩赦になったときはcontinue.
そうでない場合は、死刑執行回数++.
0が恩赦がされた場合は、OKnum ++.

で、
var i, par,trynum,oknum ;
trynum = oknum = 0 ;
for( i = 0 ; i < 1000000 ; i ++ ) {
    par = Math.floor(Math.random()*3) ;
    if( par == 1 ) continue ;
    trynum ++ ;
    if( par == 0 ) oknum ++ ;
}
document.write(" person0 survive "+(oknum/trynum*100).toFixed(2)+"%, when person1 killed<br>");
結果は約50%.問題は合計試行回数だろうね。
この議論は、gm300 (14617)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
  • by tagga (31268) on 2009年12月09日 0時16分 (#1685868) 日記

    お求めなのは 「B が死刑になるときに A が恩赦になる割合」で、 3囚人問題で欲しいのは、 「B が死刑になると看守が言ったときに A が恩赦になる割合」です。 B が死刑になるときでも、看守は C が死刑になると答える可能性があります。

    javascript はどうも相性が悪いので、Perl で書き直すと次のようになります。

    my $par;

    sub guard_says() {
        if ($par == 0) {
            # A が恩赦のときの看守の答え方を変えると、
            # 求める確率が変化する。
            # return 1; # 必ず B と答える。看守がBと答えたときのAが恩赦の確率は 1/2。
            return rand() <= 0.5 ? 1 : 2; # コイントスで答える。確率は 1/3。
            # return 2; # 必ず C と答える。確率は 0。
        } else {
            if ($par == 1) {
                return 2;
            } else {
                return 1;
            }
        }
    }

    my $trynum = 0;
    my $oknum = 0;
    for (my $i = 0; $i < 10000; $i++) {
        $par = int(rand(3));
        if (guard_says() == 1) {
            $trynum++;
            $oknum++ if $par == 0;
        }
    }

    print $oknum, "/", $trynum, " = ", $oknum / $trynum, "\n";

typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...