回答
面の数が s
ということは、1つのサイコロの面は R = {1, 2, …, s}
なので、n
個のサイコロを降ったとき、出る目の全パターンは直積集合 R^n
で表されます。
なので、直積集合の各要素を生成できる itertools.product で出る目のすべてのパターンを生成して、和が target となる通り数を計算します。
出る目の通り数は s**n
なので、確率は 和が target となる通り数 / s**n
で計算すればよいかと思います。
python
1from itertools import product
2import matplotlib.pyplot as plt
3
4
5def probability(n_dices, sides, target):
6 rolls = range(1, sides + 1) # サイコロの目の一覧 [1, 2, ..., sides]
7
8 cnt = 0 # 和が target となる通り数
9 for pip in product(rolls, repeat=n_dices):
10 if sum(pip) == target:
11 cnt += 1
12
13 # 和がその数となる通り数 / すべての通り数
14 prob = cnt / n_dices ** sides
15 return prob
サイコロ2つの場合の結果
python
1# サイコロ2つの場合
2sums = range(2, 13)
3probs = []
4for i in sums:
5 p = probability(2, 6, i)
6 probs.append(p)
7
8 print(f"{i: >4}: {p:.4%}")
9
10fig, ax = plt.subplots()
11ax.stem(sums, probs, use_line_collection=True)
12# y 軸をパーセント表示にする。
13ax.set_yticklabels([f"{x:.2%}" for x in ax.get_yticks()])
14plt.show()
2: 1.5625%
3: 3.1250%
4: 4.6875%
5: 6.2500%
6: 7.8125%
7: 9.3750%
8: 7.8125%
9: 6.2500%
10: 4.6875%
11: 3.1250%
12: 1.5625%