私が正しく理解していれば、問題は個以上のヘッドの最初の実行が終了する時間の確率分布を見つけることです。ん
編集確率は、行列乗算を使用して正確かつ迅速に決定することができ、分析的に平均値を計算することも可能であるなどのとのような分散σ 2 = 2 N + 2(μ - N - 3 ) - μ 2 + 5 μ μ = μ - + 1μ−= 2n + 1− 1σ2= 2n + 2(μ - N - 3 ) - μ2+ 5 μμ = μ−+ 1、しかしおそらくディストリビューション自体のための単純な閉じたフォームはありません。特定の数のコインフリップを超えると、分布は基本的に幾何学的な分布になります。このフォームを使用してを大きくすることは理にかなっています。t
状態空間の確率分布の時間発展は、状態の遷移行列を使用してモデル化できます。ここで、n =連続するコインフリップの数です。状態は次のとおりです。k = n + 2n =
- 状態、頭なしH0
- 状態、Iヘッド、1 ≤ I ≤ (N - 1 )H私私1 ≤ I ≤ (N - 1 )
- 状態、n以上のヘッドHんん
- 状態、n個以上の頭の後に尾が続くH∗ん
あなたは、状態に入るたらあなたは、他のいずれかの状態に戻って取得することはできません。H∗
状態に入る状態遷移確率は次のとおりです
- 状態:確率1H0 Hiから、i=0、…、n−1、つまりそれ自体を含むが状態Hnは含まない12H私i = 0 、… 、n − 1Hん
- 状態:確率1H私Hi−1から 212Hi − 1
- 状態:確率1HんからのHN-1、HNを有する状態から、すなわち、N-1つのヘッド自体12Hn − 1、Hんn − 1
- 状態:確率1H∗からのHNから確率1H*(自体)12HんH∗
したがって、たとえば、場合、これは遷移行列を与えますn = 4
バツ= ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪H0H1H2H3H4H∗H012120000H112012000H212001200H312000120H400001212H∗000001⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪
場合について、確率の初期ベクトルpがあり、P = (1 、0 、0 、0 、0 、0 )。一般に、初期ベクトルは
p i = { 1 i = 0 0 i > 0です。n = 4pP =(1、0、0、0、0、0)
p私= { 10i = 0i > 0
ベクトルは、任意の時間における空間内の確率分布です。必要な累積分布関数は、時間内の累積分布関数であり、時間tまでに少なくともn回のコインフリップが終了した確率です。これは、(X t + 1 p )kと書くことができ、連続するコインフリップの最後の実行の最後から状態H ∗ 1タイムステップに到達することに注意してください。pんt(Xt + 1p )kH∗
時間の必要PMFは、以下のように書くことができる。しかし数値これは、はるかに大きな数(から非常に少数奪う含む≈ 1)と精度を制限します。したがって、計算では、1よりもX k 、k = 0を設定することをお勧めします。次に、結果の行列X ′ = X |に対してX ′を書き込みます。X k 、k = 0(Xt + 1p )k− (Xtp )k≈ 1バツk 、k= 0X′X′=X|Xk,k=0、PMFは。これは、任意の作品以下の単純なRプログラムで実装されているものであり、N ≥ 2、(X′t+1p)kn≥2
n=4
k=n+2
X=matrix(c(rep(1,n),0,0, # first row
rep(c(1,rep(0,k)),n-2), # to half-way thru penultimate row
1,rep(0,k),1,1,rep(0,k-1),1,0), # replace 0 by 2 for cdf
byrow=T,nrow=k)/2
X
t=10000
pt=rep(0,t) # probability at time t
pv=c(1,rep(0,k-1)) # probability vector
for(i in 1:(t+1)) {
#pvk=pv[k]; # if calculating via cdf
pv = X %*% pv;
#pt[i-1]=pv[k]-pvk # if calculating via cdf
pt[i-1]=pv[k] # if calculating pmf
}
m=sum((1:t)*pt)
v=sum((1:t)^2*pt)-m^2
c(m, v)
par(mfrow=c(3,1))
plot(pt[1:100],type="l")
plot(pt[10:110],type="l")
plot(pt[1010:1110],type="l")
上のプロットは、0から100の間のpmfを示しています。下の2つのプロットは、10から110の間および1010から1110の間のpmfを示し、自己相似性と、@ Glen_bが言うように、分布が次のように見えるという事実を示しています整定期間後の幾何分布によって近似されます。
Xtpt+1≈c(n)ptc(n)2n+1cn(c−1)+1=0ntnp100n=2t
次のように計算した平均と分散が原因で、分布に使用できる閉じた形式があると思われます。
n2345678910Mean715316312725551110232047Variance241447363392147206169625344010291204151296
t=100000
n=2,…,10
pi,tHitq∗,tH∗t
- tpi,t,0≤i≤nq∗,ti
- p∗,tt
t+1t
p0,t+1=12p0,t+12p1,t+…12pn−1,t=12∑i=0n−1pi,t=12(1−pn,t−q∗,t)
H0Hn−1n−1pn−1,t+n−1=12n−1p0,tpn−1,t+n=12n(1−pn,t−q∗,t)
Hnt+1pn,t+1=12pn,t+12pn−1,t=12pn,t+12n+1(1−pn,t−n−q∗,t−n)(†)
q∗,t+1−q∗,t=12pn,t⟹pn,t=2q∗,t+1−2q∗,t2q∗,t+2−2q∗,t+1=q∗,t+1−q∗,t+12n+1(1−2q∗,t−n+1+q∗,t−n)
t→t+n2q∗,t+n+2−3q∗,t+n+1+q∗,t+n+12nq∗,t+1−12n+1q∗,t−12n+1=0
n=4n=6n=6t=1:994;v=2*q[t+8]-3*q[t+7]+q[t+6]+q[t+1]/2**6-q[t]/2**7-1/2**7
編集この繰り返し関係から閉じたフォームを見つけるためにどこに行くべきかわかりません。ただし、平均の閉じた形式を取得することは可能です。
(†)p∗,t+1=12pn,t
pn,t+12n+1(2p∗,t+n+2−p∗,t+n+1)+2p∗,t+1=12pn,t+12n+1(1−pn,t−n−q∗,t−n)(†)=1−q∗,t
t=0∞E[X]=∑∞x=0(1−F(x))p∗,t2n+1∑t=0∞(2p∗,t+n+2−p∗,t+n+1)+2∑t=0∞p∗,t+12n+1(2(1−12n+1)−1)+22n+1=∑t=0∞(1−q∗,t)=μ=μ
H∗
E[X2]=∑∞x=0(2x+1)(1−F(x))
∑t=0∞(2t+1)(2n+1(2p∗,t+n+2−p∗,t+n+1)+2p∗,t+1)2∑t=0∞t(2n+1(2p∗,t+n+2−p∗,t+n+1)+2p∗,t+1)+μ2n+2(2(μ−(n+2)+12n+1)−(μ−(n+1)))+4(μ−1)+μ2n+2(2(μ−(n+2))−(μ−(n+1)))+5μ2n+2(μ−n−3)+5μ2n+2(μ−n−3)−μ2+5μ=∑t=0∞(2t+1)(1−q∗,t)=σ2+μ2=σ2+μ2=σ2+μ2=σ2+μ2=σ2
平均と分散はプログラムで簡単に生成できます。たとえば、上記の表の平均と分散を確認するために使用します
n=2:10
m=c(0,2**(n+1))
v=2**(n+2)*(m[n]-n-3) + 5*m[n] - m[n]^2
最後に、あなたが書いたときにあなたが何を望んでいたのかわかりません
テールがヒットしてヘッドのストリークを壊すと、カウントは次のフリップから再開します。
nn
μ−1μ+1Xk,k,=0X1,k=1H0H∗n=4
H0H1H2H3H4H∗probability0.484848480.242424240.121212120.060606060.060606060.03030303
H∗=1/0.03030303=33=μ+1
付録:正確な確率を生成するために使用されるPythonプログラムn
= N
トス上の連続した頭の数。
import itertools, pylab
def countinlist(n, N):
count = [0] * N
sub = 'h'*n+'t'
for string in itertools.imap(''.join, itertools.product('ht', repeat=N+1)):
f = string.find(sub)
if (f>=0):
f = f + n -1 # don't count t, and index in count from zero
count[f] = count[f] +1
# uncomment the following line to print all matches
# print "found at", f+1, "in", string
return count, 1/float((2**(N+1)))
n = 4
N = 24
counts, probperevent = countinlist(n,N)
probs = [count*probperevent for count in counts]
for i in range(N):
print '{0:2d} {1:.10f}'.format(i+1,probs[i])
pylab.title('Probabilities of getting {0} consecutive heads in {1} tosses'.format(n, N))
pylab.xlabel('toss')
pylab.ylabel('probability')
pylab.plot(range(1,(N+1)), probs, 'o')
pylab.show()