🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

1471閲覧

サイコロの出る目の確率について

kosshi_s

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/06 01:14

複数のサイコロの出る目の確率(小数4桁)を求める関数を作成しています。

関数名:def probability(dice_number, sides, target):
引数:dice_number→サイコロの数,sides→サイコロの面の数,target→求める確率の出る目

例えば、def probability(2, 6, 3)の場合、「2つの6面のサイコロを振って3が出る確率を求める」
という事になります。
(※因みに確率は0.0556となります)

どの様に実装していけば良いか、ここ数日考えているのですが、いい案が思いつきません。
実装方法について教えて頂けないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

archiver

2019/09/06 01:23

確率の出し方まではわかってるんですよね? (これがわからなければ、まずは数学から、ということになりますが) まずは思った通りのコードを書いてみてください。そして、どの辺りがわからないかを示してみてください。
guest

回答4

0

ベストアンサー

回答

面の数が 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%

イメージ説明

投稿2019/09/06 02:03

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kosshi_s

2019/09/06 02:53

ありがとうございました! サイコロ毎にサイコロの面の配列を動的に作って・・・など難しく考えていましたが、発想転換すればこの様に鮮やかに解ける事に感動しました。 1部修正し、結果を確認したコードを以下に記載します。 from itertools import product def probability(n_dices, sides, target): rolls = range(1, sides + 1) # サイコロの目の一覧 [1, 2, ..., sides] cnt = 0 # 和が target となる通り数 for pip in product(rolls, repeat=n_dices): if sum(pip) == target: cnt += 1 # 和がその数となる通り数 / すべての通り数 prob = cnt / sides ** n_dices return round(prob, 4)
guest

0

456サイの目の確率ついては、賭博破戒録カイジを読んでいると答えとして班長の計算表が出てきます。サイコロの目の確率はストーリーにおける重要なファクターなので、自然と興味がわき、自発的にサイコロの目に対する確率の考え方を習得する良いきっかけになると思います。オススメです。

投稿2019/09/06 01:41

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ヒントだけになりますが・・・python得意じゃない^^;
(同一の目が出る確率が出ればいいので)
In [1]: n = 2

In [2]: f = 6

In [3]: 1/f * 1/f * n
Out[3]: 0.05555555555555555

投稿2019/09/06 01:38

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/09/06 01:54 編集

環境 LinuxMint 19.2 Python 3.7.4 (default, Aug 13 2019, 20:35:49) IPython 7.8.0 -- An enhanced Interactive Python
guest

0

一つのサイコロを振って出る目の確率はいくらですか?
まずそれをはっきりさせとけば、複数持ってきたときの確率は算出できると思います。

逆に、それが不明ではどーあがいてもできないですね

投稿2019/09/06 01:25

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問