『出揃うまでの回数』解答


◆愛知県 迷子の雄猫 さんからの解答。

【問題1】

1つ目は一回目で必ずでる。

2つ目は
の確率ででるから、
確率的には6回振れば5個出ることになる。

よって、1個出るための平均の回数は
同様に、3つ目は

回、
4つ目は
=2回、
5つ目は
=3回、
6つ目は
=6回

1つ目=1=1
2つ目=1+
=2+
3つ目=1+

=3+
10
4つ目=1+

+2=5+
10
5つ目=1+

+2+3=8+
10
6つ目=1+

+2+3+6=14+
10

【問題2】

k=1の場合には
R
Σ
s=1
n1
n-s1


までは判りますが・・・
ここから手がつけられないです(汗)


◆兵庫県 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) に収束する。

なお、ここでEは単位行列である。

「R種類以上が出揃う」を考える場合、Sの次元はRで良い。
また、S(1)はK(=選ぶ数)番目のみ1で他は0である。

 BのI行J列の成分は K≦J<R J≦I≦min(J+K,R-1) において 
N−J×K-D/ である。
ここで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)(有理数、グラフィクス上書きモード)使用前提です。

下記は計算結果です。


 『出揃うまでの回数』へ

 数学の部屋へもどる