条件付き確率の問題をモンテカルロ法で解く

条件付き確率の問題をモンテカルロ法で実験する - きまぐれメモ にインスパイヤされて、ここにある「問 1」を解きます。以下のような問題です。

ある母親には子どもが二人いる。その人に「男のお子さんはお持ちですか?」と
尋ねたところ、彼女は「はい」と答えた。子どもが二人とも男である確率を求めよ。

答えは考えれば分かるのですが、1/3 となります。条件付き確率の問題をモンテカルロ法で実験する - きまぐれメモ では Perl を用いていますが、同じようにして awk で解いてみます。

#! /usr/local/bin/nawk -f
# conditional_prob_boys_girls.awk
# 条件付き確率の問題をモンテカルロ法で実験する
# usage: nawk -f conditional_prob_boys_girls.awk num

BEGIN {
    num = ARGV[1];
    num_children = 2;

    for (i = 1; i <= num; i++) {

        for (j = 1; j <= num_children; j++) {
            children[j] = (rand() < 0.5) ? "boy" : "girl";
        }

        # 少なくともひとり男の子である場合
        for (k in children) {
            if (children[k] == "boy") {
                count1++;
                break;
            }
        }

        # みんな男の子である場合
        num_boy = 0;
        for (k in children) {
            if (children[k] == "boy") {
                num_boy++;
            }
        }
        if (num_boy == num_children) {
            count2++;
        }

    }

    print "試行回数                 : " num;
    print "少なくともひとり男の子   : " count1;
    print "みんな男の子             : " count2;
    print "割合                     : " count2 / count1;
    print "理論値(1/3)とのずれ(%)   : " 100 * (count2 / count1 - 1 / 3);
}

こういう数値実験はいろいろな数値で試すと収束度合いが良く分かります。 nawk だと大きな数を計算させるのに時間がかかるので、ここでは mawk で計算させてみます。

$ mawk -f conditional_prob_boys_girls.awk 10
試行回数                 : 10
少なくともひとり男の子   : 8
みんな男の子             : 
割合                     : 0
理論値(1/3)とのずれ(%)   : -33.3333

$ mawk -f conditional_prob_boys_girls.awk 100
試行回数                 : 100
少なくともひとり男の子   : 75
みんな男の子             : 29
割合                     : 0.386667
理論値(1/3)とのずれ(%)   : 5.33333

$ mawk -f conditional_prob_boys_girls.awk 1000
試行回数                 : 1000
少なくともひとり男の子   : 760
みんな男の子             : 258
割合                     : 0.339474
理論値(1/3)とのずれ(%)   : 0.614035

$ mawk -f conditional_prob_boys_girls.awk 10000
試行回数                 : 10000
少なくともひとり男の子   : 7516
みんな男の子             : 2539
割合                     : 0.337813
理論値(1/3)とのずれ(%)   : 0.447933

$ mawk -f conditional_prob_boys_girls.awk 100000
試行回数                 : 100000
少なくともひとり男の子   : 74913
みんな男の子             : 24616
割合                     : 0.328595
理論値(1/3)とのずれ(%)   : -0.473883

$ mawk -f conditional_prob_boys_girls.awk 1000000
試行回数                 : 1000000
少なくともひとり男の子   : 749277
みんな男の子             : 250057
割合                     : 0.333731
理論値(1/3)とのずれ(%)   : 0.0397717

だんだん答えである 1/3 に収束している度合いが見て取れます。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png