質問するログイン新規登録

回答編集履歴

1

コード追加

2020/06/18 12:13

投稿

hope_mucci
hope_mucci

スコア4447

answer CHANGED
@@ -13,4 +13,77 @@
13
13
 
14
14
  を計算すれば、最終的に求める確率が計算できます。
15
15
 
16
- 以上の考え方が正しいなら、回答は25/33になるはずです。
16
+ 以上の考え方が正しいなら、回答は25/33になるはずです。
17
+
18
+ ### 追記
19
+ 全然質問者から反応ないけど回答を実装したソースです。まだ質問を見てくれている方へ。
20
+ ```python
21
+ from collections import defaultdict
22
+ # ラッキー判定
23
+ def lucky(p,c):
24
+ return p < c
25
+
26
+ # 探索関数。引数はそれまでのサイコロの出目のリスト
27
+ def search(l):
28
+ global cnt
29
+ p = l[-1] # リストの一番最後の出目
30
+ # 10投して全部ノーラッキーだったら総数にカウントする
31
+ # リストの要素数が10だったら条件成立
32
+ if len(l) == N:
33
+ #
34
+ cnt += 1
35
+ cnt_d[p] += 1
36
+ return
37
+ # それ以外の場合は次のサイコロ試行。1~6
38
+ for c in range(1,7):
39
+ # ラッキーだったらそこで探索終了
40
+ if lucky(p,c):
41
+ pass
42
+ else:
43
+ # ノーラッキーだったら引数のリストに今の出目を加えて次の試行へ
44
+ search(l + [c])
45
+
46
+ cnt = 0 # ノーラッキー総数
47
+ cnt_d = defaultdict(int) # 最後の出目別ノーラッキー数
48
+ N = 10 # サイコロ投擲回数
49
+ total = 6**N # 10回のサイコロ投擲総組み合わせ数
50
+
51
+ # 第1投目を初期値として与えて探索開始
52
+ for i in range(1,7):
53
+ search([i])
54
+
55
+ #10回振って一度もラッキーしない確率
56
+ print(cnt,'/',total)
57
+ # うち最後の目別のカウント
58
+ print(cnt_d)
59
+
60
+ # 分母は10投ノーラッキー数ごとに11投目の出目数の乗算
61
+ fb = cnt*6
62
+ # 分子はラッキー総数
63
+ fi = 0
64
+ # ラッキー数計算
65
+ for i in range(1,7):
66
+ fi += (cnt_d[i])*(6-i)
67
+
68
+ # 10投目までノーラッキーのとき、11投目にラッキーが出る確率
69
+ print(fi/fb)
70
+ print(fi,'/',fb)
71
+ from fractions import Fraction
72
+ print(Fraction(fi,fb))
73
+
74
+ ''' >> 出力
75
+ # 10回振って一度もラッキーしない確率
76
+ 3003 / 60466176  
77
+ # うち最後の目別のカウント
78
+ defaultdict(<class 'int'>, {1: 2002, 2: 715, 3: 220, 4: 55, 5: 10, 6: 1})
79
+ # 10投目までノーラッキーのとき、11投目にラッキーが出る確率
80
+ 0.7575757575757576
81
+ # 分数にすると
82
+ 13650 / 18018
83
+ # 約分すると
84
+ 25/33
85
+
86
+ CPU times: user 10 ms, sys: 0 ns, total: 10 ms
87
+ Wall time: 9.72 ms
88
+ '''
89
+ ```