回答編集履歴

6

文言修正

2021/09/07 08:13

投稿

fana
fana

スコア11996

test CHANGED
@@ -50,7 +50,9 @@
50
50
 
51
51
 
52
52
 
53
- 愚直に実装してみた.(早いかどうかは謎)
53
+ 愚直に実装してみた.
54
+
55
+ (「早い」かどうかは謎だけど20分とかはかからないのではないかと)
54
56
 
55
57
 
56
58
 

5

コード追加

2021/09/07 08:13

投稿

fana
fana

スコア11996

test CHANGED
@@ -43,3 +43,139 @@
43
43
 
44
44
 
45
45
  となるかもしれないけども,実際には2.の時点で取り得る総ポイントのパターンは -2 ~ 4 の7パターンしかないので,ここでデータをまとめてしまえば,3.での組み合わせを 7*4 = 28 パターンに減らせる.
46
+
47
+
48
+
49
+ ---
50
+
51
+
52
+
53
+ 愚直に実装してみた.(早いかどうかは謎)
54
+
55
+
56
+
57
+ ```C++
58
+
59
+ //Yによって定まる,1個のサイコロから得られるポイントの確率データを作る作業用関数.
60
+
61
+ //(めんどくさいのでYはまともな値が入ってくる前提)
62
+
63
+ void SetupPointRate( int Y, double (&Rates)[4] )
64
+
65
+ {
66
+
67
+ Rates[0] = 0.1; //-1 point の確率
68
+
69
+ Rates[2] = (Y-1) * 0.1; //1 point
70
+
71
+ Rates[3] = 0.1; // 2 point
72
+
73
+
74
+
75
+ Rates[1] = 0.8 - Rates[2]; //0 point
76
+
77
+ }
78
+
79
+
80
+
81
+ //処理実装
82
+
83
+ struct Data
84
+
85
+ {
86
+
87
+ public:
88
+
89
+ Data() : m_MinPoint(0), m_P{1.0} {}
90
+
91
+ public:
92
+
93
+ //サイコロ1回分のデータ更新作業
94
+
95
+ void Update( const double (&Rates)[4] )
96
+
97
+ {
98
+
99
+ const std::vector<double> PrevP = m_P;
100
+
101
+ const int PrevMinPoint = m_MinPoint;
102
+
103
+ --m_MinPoint;
104
+
105
+ m_P.assign( m_P.size()+3, 0 );
106
+
107
+
108
+
109
+ for( int iPrev=0; iPrev<PrevP.size(); ++iPrev )
110
+
111
+ {
112
+
113
+ int Point = PrevMinPoint + iPrev;
114
+
115
+ for( int iRate=0; iRate<4; ++iRate )
116
+
117
+ {
118
+
119
+ int deltaPoint = iRate - 1;
120
+
121
+ m_P[ Point+deltaPoint-m_MinPoint ] += ( PrevP[iPrev] * Rates[iRate] );
122
+
123
+ }
124
+
125
+ }
126
+
127
+ }
128
+
129
+
130
+
131
+ //結果表示
132
+
133
+ void Show() const
134
+
135
+ {
136
+
137
+ int Point = m_MinPoint;
138
+
139
+ for( const auto &P : m_P ){ std::cout << Point++ << " : " << P*100 << "%\n"; }
140
+
141
+ }
142
+
143
+ private:
144
+
145
+ int m_MinPoint; //現時点での最低ポイント
146
+
147
+ std::vector<double> m_P; //各ポイントの確率
148
+
149
+ };
150
+
151
+
152
+
153
+ //main
154
+
155
+ int main(void)
156
+
157
+ {
158
+
159
+ const int X=3;
160
+
161
+ const int Y=7;
162
+
163
+
164
+
165
+ double Rates[4];
166
+
167
+ SetupPointRate( Y, Rates );
168
+
169
+ Data D;
170
+
171
+ for( int i=0; i<X; ++i ){ D.Update( Rates ); }
172
+
173
+ D.Show();
174
+
175
+
176
+
177
+ return 0;
178
+
179
+ }
180
+
181
+ ```

4

要らない文字をトル

2021/09/07 08:11

投稿

fana
fana

スコア11996

test CHANGED
@@ -42,4 +42,4 @@
42
42
 
43
43
 
44
44
 
45
- となるかもしれないけども,実際には2.の時点で取り得る総ポイントのパターンは -2 ~ 4 の7パターンしかないので,ここでデータをまとめてしまえば,3.での組み合わせを 7*4 = 28 パターンに減らせる.
45
+ となるかもしれないけども,実際には2.の時点で取り得る総ポイントのパターンは -2 ~ 4 の7パターンしかないので,ここでデータをまとめてしまえば,3.での組み合わせを 7*4 = 28 パターンに減らせる.

3

例を追記

2021/09/07 07:33

投稿

fana
fana

スコア11996

test CHANGED
@@ -27,3 +27,19 @@
27
27
  で,愚直にX回の繰り返しをするとしたら,
28
28
 
29
29
  各回の時点で同じ得点のパターンがあればそいつらを統合してパターンを減らしてやればいいのでは.
30
+
31
+
32
+
33
+ 例えば,X=3のとき,愚直にやると
34
+
35
+
36
+
37
+ 1. 1個目のダイスの結果が4パターン
38
+
39
+ 2. 2個目のダイスでさらに4パターンだから,ここまでの組み合わせは 4*4=16 パターン
40
+
41
+ 3. 3個目のダイスでさらに4パターンだから,組み合わせは 16*4 = 64 パターン
42
+
43
+
44
+
45
+ となるかもしれないけども,実際には2.の時点で取り得る総ポイントのパターンは -2 ~ 4 の7パターンしかないので,ここでデータをまとめてしまえば,3.でのの組み合わせを 7*4 = 28 パターンに減らせる.

2

さらに追記

2021/09/07 07:31

投稿

fana
fana

スコア11996

test CHANGED
@@ -17,3 +17,13 @@
17
17
  要は,「出目の確率が偏った4面ダイス」を扱うのだと考えて良かろう,と.
18
18
 
19
19
  (この「4面ダイス」の各目の出る確率はYで定まる)
20
+
21
+
22
+
23
+ ---
24
+
25
+
26
+
27
+ で,愚直にX回の繰り返しをするとしたら,
28
+
29
+ 各回の時点で同じ得点のパターンがあればそいつらを統合してパターンを減らしてやればいいのでは.

1

追記

2021/09/07 07:26

投稿

fana
fana

スコア11996

test CHANGED
@@ -11,3 +11,9 @@
11
11
 
12
12
 
13
13
  の「10倍」のところを,4倍にはできるのではないでしょうか.
14
+
15
+
16
+
17
+ 要は,「出目の確率が偏った4面ダイス」を扱うのだと考えて良かろう,と.
18
+
19
+ (この「4面ダイス」の各目の出る確率はYで定まる)