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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

2回答

3313閲覧

pythonでのnumpyを用いた確率計算について

sak-2

総合スコア12

Python 3.x

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

0グッド

1クリップ

投稿2016/11/30 14:12

###前提・実現したいこと

「Pythonから始める数学入門」という本の内容について質問させてください。
この本の第5章「数学と確率を操作する」の5.2.3.3 「目標点数は可能か」というサンプルコードが掲載されています。

このソースコードはサイコロを振る最大試行回数と、目標値を入力し、
出た目の和が目標値に達する確率をシミュレーションするプログラムです。

このソースコードでは、
[サイコロの目の集合] * [最大試行回数]の直積で標本空間を定義しているのですが、
この標本空間では、例えば
目標値 : 10
最大試行回数 : 5 とした場合に、
5回目以前の2回目や3回目で目標値に達した場合のような試行を網羅できていないように思われます。

本の記述としては、"最大"とあるのでそれまでの試行回数を網羅しているはずですが、該当ソースコードのどの部分でそれが実現しているのかがわからず、もやもやしています。

ぜひとも有識者の方、ご回答並びに解説いただけないでしょうか。

よろしくお願いいたします。

###該当のソースコード

python3

1## 目標とする点数が決められた振れる回数内で可能かどうかを示す 2from sympy import FiniteSet 3import random 4 5def find_prob(target_score, max_rolls): 6 die_sides = FiniteSet(1,2,3,4,5,6) 7 # 標本空間 8 s = die_sides ** max_rolls 9 # 事象 10 if max_rolls > 1: 11 success_rolls = [] 12 for elem in s: 13 if sum(elem) >= target_score: 14 success_rolls.append(elem) 15 else: 16 if target_score > 6: 17 success_rolls = [] 18 else: 19 success_rolls = [] 20 for roll in die_sides: 21 if roll >= target_score: 22 success_rolls.append(roll) 23 e = FiniteSet(*success_rolls) 24 # 目標点数に達する確率の計算 25 return len(e)/len(s) 26 27if __name__ == '__main__': 28 target_score = int(input('Enter the target score : ')) 29 max_rolls = int(input('Enter the maimum number of rolls allowed : ')) 30 p = find_prob(target_score, max_rolls) 31 print('Probability : {0:5f}'.format(p))

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

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

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

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

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

guest

回答2

0

プログラムの内容は、
あらゆるサイコロ出目のパターンを考え ここ→ for elem in s:
結果的にそれが目標点を超えているか? ここ→ if sum(elem) >= target_score:
という単純なものです。

else以下は飾りです。サイコロ投げの回数を1回に設定するのはゲームとしてはつまらないですし、この部分をわざわざコードに書くのは本質を見えにくくするだけです。何かを試したい場合は、本質的な部分だけに注目して、その他はばっさり捨てましょう。あらゆる場合を想定したコードを書くのは最終段階です。

勿論途中でやめる、というルールを入れたプログラムも書けます。そちらのほうが現実の行動にあっていますし、
計算量も減らせます。面白いと思うのでぜひ挑戦してみてください。

投稿2016/12/01 04:41

WathMorks

総合スコア1582

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

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

0

python

1if sum(elem) >= target_score: 2 success_rolls.append(elem)

の部分で最大試行回数分だけサイコロを振った目の合計を計算して、目標値に到達しているのか確認しています。
この部分を以下のように変えると、サイコロの出目の組み合わせが表示されるので
2回目や3回目で目標値に到達したケースもカバーされていることが確認できると思います。

python

1if sum(elem) >= target_score: 2 print('今回の出目: {0}'.format(elem)) 3 success_rolls.append(elem)

投稿2016/11/30 23:03

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問