重複のある順列


雑誌ニュートンに確率の特集がありました。その中に、「サイコロを3回振って、9になる確率と10になる確率のどちらが高いか?」というのがありました。

むかしからギャンブラーを悩ませていた問題で、9になる場合の組合せ6通り(126 135 144 225 234 333)、10になる場合の組合せ6通り(136 145 226 235 244 334)なのに直感的に10になる確率の方が高そうであるというのですが、これは数え上げる際に順序を考慮に入れれば、10になる場合の方が多いということでした。

ニュートンのきれいなカラーページを使って全部数え上げていましたが、これをAPL/J言語で考えてみましょう。3回だから全部数え上げても大した数ではない。6の3乗ですね。これを6個の中から3個選ぶ選び方の数と思うと間違い。重複を許すので、単純に6の3乗。

   6^3
216

紙に書いて考えると、1 1 1から始まって、6 6 6ということが予想できます。216個配列を作って、それぞれを足して、9になるものの個数と10になるものの個数を数えればよい。
今、課題を、サイコロを3面として、2回投げて、合計が2になるものと3になるものの個数を数える、とすると大体相似形の課題になりますよね。やってみよう。

   threedice =: 1 2 3   NB.サイコロの名前をthreediceとします
  9 2 $, > { threedice ; threedice    NB.2回投げたときの組合せは3^2=9通りですね
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
   throwtwice=: 9 2 $, > { threedice ; threedice   NB.thrwotwiceという変数に入れて
   +/"1 throwtwice   NB.それぞれを足してみます
2 3 4 3 4 5 4 5 6
   2 = +/"1 throwtwice   NB.合計が2になるのは1回だけ
1 0 0 0 0 0 0 0 0
   3 = +/"1 throwtwice   NB.合計が3になるのは2回あります
0 1 0 1 0 0 0 0 0

うまく行っているようなので、こんどは6面のほんとのサイコロで3回投げて実験します。

   dice=: 1 2 3 4 5 6   NB.6面です
   throw=: 216 3$,>{dice;dice;dice   NB.dice;dice;diceと3回投げます
   ] ary=: +/"1 throw   NB.それぞれ3回の目を足したものの配列
3 4 5 6 7 8 4 5 6 7 8 9 5 6 7 8 9 10 6 7 8 9 10  ...
   +/ 9 = ary   NB.足して9になるのは25回
25
   +/ 10 = ary   NB.足して10になるのは27回
27

というわけで足して10になる方が場合の数が多いので確率が高いことが立証されました。

今回、この記事を書くのに、順列(permutation)のことを調べました。重複を許さない場合の数についてはあちこちに載っているのですが、今回のように重複を許す場合の数え方について詳しい記事はあまりありませんでした。


「重複順列」などのワード検索でここにたどり着いた方は、APL/J言語にびっくりするでしょうが、算数の実験に適した言語で書いてあることをやるだけだと知識もほとんど不要ですので、ぜひ一度トライして下さい。インストールにアドミン権限不要です。無料です。簡易電卓として優秀と思います。10分もあれば使えるようになると思います。