サイコロを 100 回振って各目の出る割り合いを求める

サイコロを100回振って、各目の出る割り合いを求める - みずぴー日記 からインスパイヤされていますが、単純に 100 回だと面白くないので、任意の回数で遊べるようにしてみました。

確率的には 1/6 = 16.666 (%) で当分に分けられるわけですが、実際にやってみると、なかなかそうもいかないのが確率の面白いところでもあります。 プログラムとしては以下のようなものになります。

#! /usr/local/bin/nawk -f
# roll_dice.awk
# サイコロを 100 回振って、1〜6 の目が出る割合を求める
# usage: nawk -f roll_dice.awk [num]

BEGIN {
    srand();
    num = ARGV[1] ? ARGV[1] : 100;

    for (i = 1; i <= num; i++) {
        num_dice = int(rand() * 6) + 1;
        count[num_dice]++;
    }

    for (i = 1; i <= 6; i++) {
        print i " の目: " count[i] " 回 (" count[i] / num * 100 " %)";
    }
}

速度的な問題もあるので、ここでは mawk で大きな数まで試してみましょう。

$ mawk -f roll_dice.awk 1
1 の目:  回 (0 %)
2 の目: 1 回 (100 %)
3 の目:  回 (0 %)
4 の目:  回 (0 %)
5 の目:  回 (0 %)
6 の目:  回 (0 %)

$ mawk -f roll_dice.awk 10
1 の目: 2 回 (20 %)
2 の目: 1 回 (10 %)
3 の目: 3 回 (30 %)
4 の目: 1 回 (10 %)
5 の目: 2 回 (20 %)
6 の目: 1 回 (10 %)

$ mawk -f roll_dice.awk 100
1 の目: 10 回 (10 %)
2 の目: 36 回 (36 %)
3 の目: 8 回 (8 %)
4 の目: 19 回 (19 %)
5 の目: 10 回 (10 %)
6 の目: 17 回 (17 %)

$ mawk -f roll_dice.awk 1000
1 の目: 166 回 (16.6 %)
2 の目: 156 回 (15.6 %)
3 の目: 161 回 (16.1 %)
4 の目: 183 回 (18.3 %)
5 の目: 166 回 (16.6 %)
6 の目: 168 回 (16.8 %)

$ mawk -f roll_dice.awk 10000
1 の目: 1605 回 (16.05 %)
2 の目: 1651 回 (16.51 %)
3 の目: 1687 回 (16.87 %)
4 の目: 1665 回 (16.65 %)
5 の目: 1744 回 (17.44 %)
6 の目: 1648 回 (16.48 %)

$ mawk -f roll_dice.awk 100000
1 の目: 16558 回 (16.558 %)
2 の目: 16426 回 (16.426 %)
3 の目: 16755 回 (16.755 %)
4 の目: 16786 回 (16.786 %)
5 の目: 16729 回 (16.729 %)
6 の目: 16746 回 (16.746 %)

<snip>

$ mawk -f roll_dice.awk 100000000
1 の目: 16663126 回 (16.6631 %)
2 の目: 16671329 回 (16.6713 %)
3 の目: 16669708 回 (16.6697 %)
4 の目: 16666226 回 (16.6662 %)
5 の目: 16665058 回 (16.6651 %)
6 の目: 16664553 回 (16.6646 %)

rand() 関数を用いている関係もありますが、10000 回くらいやれば同じ確率になりそうだということが分かります。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png