N 個のサイコロをいっぺんにふったとき,出た目の和 K になる組合せは何通りあるか、という計算をするのが本題の内容。

簡単のようで、結構難しいようだ。例えば、5個のサイコロをふって目の和が20となるのは何通りあるか、聞かれても答えられないだろう。答は651通り。サイコロの数が2個や3個なら、テーブルをつくってコツコツやればできるだけど。

<関数を定義>
 文章で書くのが面倒だと感じた場合、数式を使って逃げるのが常識(かな)。ここでは、同じように、以下の関数を定義しておく。
 N 個のサイコロをいっぺんにふったとき,出た目の和 K になる組合せの数を 関数 S(N,K) とする。
 上の例では、S(5, 20) = 651 になる。

<漸化式の力>
 具体的な計算の仕方は私にも判らないが、組合せの計算によく使われる漸化式を利用しよう。

 S(N,K) = S(N-1,K-1) + S(N-1,K-2) + S(N-1,K-3) + S(N-1,K-4) + S(N-1,K-5) + S(N-1,K-6)

つまり、1つ目のサイコロの出た目は1~6のどれかなので、残りはN-1個のサイコロの出た目の和で算出できるわけだ。あっけない計算式だが、漸化式のパワーはこれでも認識できるだろう。

漸化式の初期条件は勿論、
 S(1,1) = S(1,2) = S(1,3) = S(1,4) = S(1,5) = S(1,6) = 1
である。

<サイコロの出た目の和を計算するプログラム> dice.c
 では、C言語プログラムを示す。Gnu Cの 64ビット整数 long long 型が使われているが、コンパイラーによっては修正が必要かもしれない。(余談だが、64ビットCPUが間もなく普及するので、128ビット整数も間もなく使えるだろう。) なお、数学的にはサイコロの数Nに上限はないが、プログラムでは N=26が上限になるようだ。それよりも大きいNだとオーバーフローになることもある。
 
プログラムの使い方は簡単、NとKの値を入力し、出力を見ればOK。
 例: N=26、K=91、出力 S(26,91) = 7766945604528200460

プログラムの応用は色々考えられるだろう。
 ・ 出た目の和がK以上の組合せ?
 ・ 出た目の和が素数になる確率?

Comments are closed.

Post Navigation