サイコロを複数振ったときに「合計が特定の数の倍数になる確率」を求める問題は、一見すると数え上げで解けそうですが、一般化すると急に難しくなります。特にサイコロの個数がm個、出目が1〜n、判定がSの倍数となると、全列挙は現実的ではありません。この記事では、このような一般問題をどう扱うのか、その考え方と代表的な解法をわかりやすく整理します。
単純な場合は全列挙で解ける
例えばサイコロ3個(6面体)なら、全事象は6^3=216通りです。
この程度であれば、実際にすべての組み合わせを書き出して条件を満たすものを数えることが可能です。
そのため小規模な問題では「力技の数え上げ」が有効です。
一般化すると何が難しくなるのか
サイコロがm個、各サイコロの出目が1〜nの場合、全事象はn^m通りになります。
例えばm=10、n=6でも6^10=約600万通りとなり、手作業は困難です。
さらに「合計がSの倍数」という条件は単純な範囲条件ではなく、剰余(mod)条件になるため、単純な場合分けもできません。
基本となる考え方:剰余(mod)で分類する
この種の問題の本質は「合計をSで割った余り」にあります。
合計がSの倍数であるとは、合計 ≡ 0 (mod S) ということです。
したがって、各サイコロの出目をSで割った余りごとに分類し、その遷移を考えます。
この考え方により、問題は「剰余クラスの遷移問題」に変換されます。
解法1:動的計画法(DP)による方法
最も標準的な方法は動的計画法です。
dp[i][r] = i個のサイコロを振って合計の余りがrになる確率(または通り数)と定義します。
遷移は次のようになります。
dp[i+1][(r + k) mod S] += dp[i][r] (kは出目)
この方法により、O(m×S×n)程度で計算可能になります。
解法2:生成関数を使う方法
より理論的な解法として「生成関数」があります。
各サイコロを多項式として表します。
例えば1〜nのサイコロなら、x + x^2 + … + x^n となります。
これをm乗し、展開したときの指数が合計を表します。
そして x^k の係数を mod S ごとにまとめることで、目的の確率を求めることができます。
結論:公式はあるが「形は1つではない」
結論として、この問題に単純な1行の公式はありません。
しかし、次の2つが本質的な解法になります。
・動的計画法(DP)による剰余管理
・生成関数による多項式展開
つまり「公式がない」のではなく、「状況に応じて使う枠組みがある」というのが正確な理解です。
まとめ
小規模なサイコロ問題は全列挙で解けますが、一般化された問題では剰余で分類する発想が必要になります。
その上で、動的計画法や生成関数を使うことで効率的に解くことができます。
確率問題の本質は「数え上げ」から「構造の利用」へと移る点にあり、この視点を持つことで難問も整理して考えられるようになります。


コメント