質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.37%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 2,463

score 16

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • archiver

    2019/09/06 10:23

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

    キャンセル

回答 4

checkベストアンサー

0

回答

面の数が s ということは、1つのサイコロの面は R = {1, 2, …, s} なので、n 個のサイコロを降ったとき、出る目の全パターンは直積集合 R^n で表されます。

なので、直積集合の各要素を生成できる itertools.product で出る目のすべてのパターンを生成して、和が target となる通り数を計算します。

出る目の通り数は s**n なので、確率は 和が target となる通り数 / s**n で計算すればよいかと思います。

from itertools import product
import matplotlib.pyplot as plt


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 / n_dices ** sides
    return prob

サイコロ2つの場合の結果

# サイコロ2つの場合
sums = range(2, 13)
probs = []
for i in sums:
    p = probability(2, 6, i)
    probs.append(p)

    print(f"{i: >4}: {p:.4%}")

fig, ax = plt.subplots()
ax.stem(sums, probs, use_line_collection=True)
# y 軸をパーセント表示にする。
ax.set_yticklabels([f"{x:.2%}" for x in ax.get_yticks()])
plt.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 11: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)

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

In [2]: f = 6                                                                                   

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/06 10:53 編集

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

    キャンセル

-1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る