◆愛知県 迷子の雄猫 さんからの解答。
【問題1】
1つ目は一回目で必ずでる。
2つ目は | 5 6 | の確率ででるから、 |
よって、1個出るための平均の回数は | 6 5 | 回 |
同様に、3つ目は | 6 4 | = | 3 2 | 回、 |
4つ目は | 6 3 | =2回、 |
5つ目は | 6 2 | =3回、 |
6つ目は | 6 1 | =6回 |
答
1つ目=1=1 |
2つ目=1+ | 6 5 | =2+ | 1 5 |
3つ目=1+ | 6 5 | + | 3 2 |
=3+ | 7 10 |
4つ目=1+ | 6 5 | + | 3 2 |
+2=5+ | 7 10 |
5つ目=1+ | 6 5 | + | 3 2 |
+2+3=8+ | 7 10 |
6つ目=1+ | 6 5 | + | 3 2 |
+2+3+6=14+ | 7 10 |
【問題2】
k=1の場合には
R Σ s=1 |
nC1 n-sC1 |
◆兵庫県 sinapusu さんからの解答。
VBAコードです。
数式的に解こうと思ったのですが、お手上げになったのでとりあえず作成しました。
n=ダイスの面数
datums=全部の目が出る確率がこれ以上になって欲しい確率
全部の目がdatums以上になる回数を求めるコードです。
datums=0.3としたら何回か振ったときに全部の目が出る確率が30%以上になっていたらその回数を書き出して終了します。
桁落ちや数値計算に関する知識がないものでnを大きくするとすさまじい誤差が出ているかもしれません。
ポコペンさんのおかげでこのコードが作成できました。
Sub allDice() Dim n, datums, i ’ここのデータを弄ってください n = 16 datums = 0.5 Dim m m = n - 1 Dim a() As Double ReDim a(m) a(0) = 1 '無限ループ防止のためにとりあえずn*10回目までサイコロ振る For i = 1 To n * 10 a = sigumaNext1(a) If datums < a(m) Then Debug.Print i + 2 & "回目で越えました" Exit Sub End If Next End Sub Function sigumaNext1(ByRef a() As Double) As Double() Dim b() As Double Dim last Dim count, i last = UBound(a) ReDim b(last) count = last + 1 b(0) = a(0) * 1 / count For i = 1 To last - 1 If a(i - 1) > 0 Then b(i) = a(i - 1) * (count - i) / count End If If a(i) > 0 Then b(i) = b(i) + a(i) * (i + 1) / count End If Next b(last) = a(last) + a(last - 1) * 1 / count sigumaNext1 = b End Function
◆愛知県 Y.M.Ojisan さんからの解答。
【問題2】
数式ではなく、有限回での計算方法を示します。
一般にある多成分の確率状態 S(k)が
確率行列Bにより S(k+1)=B*S(k) で遷移し、
Bの固有値の絶対値が1未満なら、
期待値 | ∞ Σ I=1 |
I*BI-1S(1) | は(B−E)-2S(1) に収束する。 |
「R種類以上が出揃う」を考える場合、Sの次元はRで良い。
また、S(1)はK(=選ぶ数)番目のみ1で他は0である。
BのI行J列の成分は K≦J<R J≦I≦min(J+K,R-1) において
N−JCD×JCK-D/NCK である。
ここでDは新規増加分 D=I-Jである。
K≦J<R I=R においては 各列の成分の和を1とする値である。
また、J=R列はそこで終了なので確率0とする。
このようにして得られたBは下三角行列であり、固有値は対角成分である。
従って固有値は非負で1未満である。
N=6 K=1 R=4 の場合のBの例を示す。
最終的に得たい期待値はR番目の成分であり、S(1)はK番目だけが1なので、
結局 (B−1)-2のR行K列成分が答えである。
BASICのソースを下記に示します。
1〜K−1の成分は常に0であり、計算するのは無駄なので、K〜R成分の部分のみ計算している。
なお、十進BASIC(http://www.vector.co.jp/authors/VA008683)(有理数、グラフィクス上書きモード)使用前提です。
下記は計算結果です。