给定连续M次,预期抛硬币的次数将连续N次


10

1月,Interviewstreet进行了第二次CodeSprint,其中包括以下问题。程序化答案已发布,但不包含统计解释。

(您可以使用Google信用登录到Interviewstreet网站,然后从此页面转到Coin Tosses问题,以查看原始问题和已发布的解决方案。)

投币

您有一个不偏不倚的硬币,您想要一直扔下去,直到获得N个连续的正面。您已经抛硬币了M次,令人惊讶的是,所有抛硬币都导致了正面的损失。

在您连续获得N个脑袋之前,需要进行的额外抛球次数是多少?

输入:
第一行包含个案T的数量。接下来的T行每一行包含两个数字N和M。

输出:
输出T行,其中包含相应测试用例的答案。打印答案,精确到小数点后两位。

样本输入:
4
2 0
2 1
3 3
3 2

样本输出:
6.00
4.00
0.00
8.00

示例说明:
如果N = 2且M = 0,则需要不断掷硬币,直到连续获得2个头。不难证明平均需要掷6枚硬币。
如果N = 2且M = 1,则需要连续2个头,并且已经有1个头。无论如何,都需要再次抛掷。在第一个折腾中,如果您有头脑,那就完成了。否则,您需要重新开始,因为连续计数器会重置,并且您需要不断掷硬币,直到获得N = 2个连续头。因此,预期的抛硬币次数为1 +(0.5 * 0 + 0.5 * 6)= 4.0如果N = 3且M = 3,您已经有3个头,因此您不再需要抛硬币。

我想出的所有数学方程式都对上面列出的样本输入数据有正确的答案,但是对于所有其他输入集(都不知道)是错误的。他们的程序化解决方案似乎与我尝试采用方程式方法解决问题的方式大不相同。有人可以解释一下如何提出方程式来解决这个问题吗?


1
另请参见这里哪里还发现了通过以下丹尼尔·约翰逊给出结果。2N+12M+1
Dilip Sarwate 2012年

Answers:


8

这是一个计算练习,因此请递归考虑。硬币抛掷的当前状态是由有序对确定Ñ 中号0。让到达N个连续磁头的预期翻转次数为e N M (N,M)NM0Ne(N,M)

(1)有50%的机会下翻页将是头,带你到状态,和50%的几率下翻页将尾巴,带你到状态Ñ 0 。这需要一flip。因此,期望(递归)由(N,M+1)(N,0)

e(N,M)=12e(N,M+1)+12e(N,0)+1.

(2)基本条件:您已经规定

e(N,0)=2N+12

显然

e(N,N)=0

(不再需要翻转)。

这是相应的Mathematica程序(包括缓存中间结果以加快递归速度,这实际上使其成为一种动态编程解决方案):

e[n_, m_] /; n > m > 0 := e[n, m] = 1 + (e[n, m + 1] + e[n, 0])/2 // Simplify
e[n_, 0] := 2^(n + 1) - 2
e[n_, n_] := 0

该程序在其他支持递归的编程语言中看起来将相似。在数学上,我们可以验证简单地通过检查递归的,因为它明显地保持用于基例:e(N,M)=2N+12M+1

2N+12M+1=1+(2N+12M+2+2N+12)/2,

对于任何N,QED 都是如此。MN


更一般地,相同的方法将建立当硬币具有概率p的磁头。困难的部分是计算基本条件eN0。这是通过将递归逐出N个步骤来完成的,直到最后根据自身表示eN0并求解:e(N,M)=pNpM1ppe(N,0)Ne(N,0)

e(N,0)=1+pe(N,1)+(1p)e(n,0)=1+p(1+pe(N,2)+(1p)e(N,0))+(1p)e(N,0)=1+p+p2++pN1+(1p)[1+p++pN1]e(N,0);e(N,0)=1pN1p+(1pN)e(N,0);e(N,0)=pN11p.

1
也许迭代而不是递归工作可能更好?您有其给出ëÑ中号+1=2ëÑ中号-2Ñ+1 ë Ñ 1
e(N,M)=12e(N,M+1)+12e(N,0)+1
e(N,M+1)=2e(N,M)2N+1
等给予ëÑ中号=2Ñ+1-2中号+1或者,可以“从理论上”而不是通过迭代来解决差分方程。
e(N,1)=2e(N,0)2N+1=2(2N+12)2N+1=2N+14e(N,2)=2e(N,1)2N+1=2(2N+14)2N+1=2N+18
e(N,M)=2N+12M+1.
Dilip Sarwate 2012年

@Dilip在“它给”和“等等”上绘制的推论都是递归的。 通过“理论上解决”,您想到什么解决方法?
ub

在我看来,递归和迭代之间的区别是工作方法。对于关系递归计算x n x n = 2 x n - 1 = 2 2 x n - 1 2 =
x(n)=2x(n1),  x(0)=1,
x(n)迭代 X 0 = 1 X 1 = 2 X 0 = 2 X 2 = 2
x(n)=2x(n1)=2(2x(n2))=2(2(2x(n3)))==2(2(2x(0))=2n
“理论上”是指通过找到特征多项式,确定其根,然后将一般解拟合为初始条件来求解差分方程,而不是如上所述的简单计算。
x(0)=1x(1)=2x(0)=2x(2)=2x(1)=22x(n)=2x(n1)=22n1=2n.
Dilip Sarwate 2013年

find_x(n)if n=0 return 1 else return 2*find_x(n-1)find_xny = 1; while n > 0 do begin y=2*y; n=n-1 end; return y

如果您查看这些程序在@Dilip计算机上的实际实现方式,在许多环境(例如R)中,它们几乎没有什么不同。(在一种情况下,您创建并处理了一个向量1:n,在另一种情况下,您会发现将n:1其放置在堆栈中并进行了反向处理。)但是,我的观点的一部分是概念性的:您最初的评论是“迭代地工作”。那是指分析,而不是任何计算机程序。但是这些都是琐碎的切线点,其讨论不保证扩展此注释线程。
ub

5

为了解决这个问题,我将使用随机过程,停止时间和动态编程。

首先,一些定义:

Xn#(of consecutive heads after the nth flip)
X0X0=0XX0=M

τNmin{k:Xk=N} and τ0min{k>1:Xk=0}

τN(XτN=N)(X0=M)MN

E[τN|X0=M]=E[τN1{τN<τ0}+τN1{τN>τ0}|X0=M]
=(NM)(12)NM+E[τ0|τN>τ0,X0=M]+(1(12)NM)E[τN|X0=0]

第一个对应于在假设我们从M个连续的头开始观察到N个连续的头之前将一条尾巴翻转之前得到尾部之前的预期翻转次数。不难发现

E[τ0|τN>τ0,X0=M]=j=1NM(j)(12)j=2(NM+2)(12)NM

现在,我们要做的就是计算第二个条件期望值,该条件值对应于观察从0开始的N个连续磁头所需的翻转次数。通过类似的计算,我们看到

E[τN|X0=0]=E[τN1{τN<τ0}+τN1{τN>τ0}|X0=0]
=N(12)N+E[τ0|τN>τ0,X0=0]+(1(12)N)E[τN|X0=0]
=2N{N(12)N+(2(N+2)(12)N)}
=2N+12

最终的答案是:

E[τN|X0=M]=(NM)(12)NM+2(NM+2)(12)NM+(1(12)NM)(2N+12)
=2N+12M+1

这与您列出的四个测试用例一致。有了这样一个简单的答案,可能会有一种更简单的方法来进行计算。


1
与上面列出的递归概念相比,这是一种更难解决的方法,但是将两种方法放在一起会非常有用。大多数人都不喜欢停止时间方法也可以用于解决小的实际问题的方式。
2012年

2

警告: 以下内容可能不会被视为正确答案,因为它不能为问题提供封闭式解决方案,尤其是。与先前的答案相比。但是,我发现该方法足以解决条件分布问题。

Nk1p(N,k)

p(N,k)={1if k<Nm=1N12mp(N,km)else
NkNN

mN

     p(N,m-N-1) \dfrac{1}{2^{N+1}} &\text{if } N<m<2N+1
     \end{cases}

mN1NNmN1

MN mN

     0 &\text{if } N<m\le N+M\\

      \dfrac{1}{2^{M}}\sum_{r=M+1}^{N}\dfrac{1}{2^{r-M}}q(N,m-r)&\text{if } N+M<m

Hencetheconditionalprobabilityofwaiting$m$stepstoget$N$consecutiveheadsgiventhefirst$M$consecutiveheadsis

Theexpectednumberofdrawscanthenbederivedby
E(M,N)M 脚步...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.