Oczekiwana liczba rzutów monetą, aby uzyskać N z rzędu, biorąc pod uwagę M z rzędu


10

Interviewstreet miał swój drugi CodeSprint w styczniu, który zawierał poniższe pytanie. Odpowiedź programowa jest opublikowana, ale nie zawiera wyjaśnienia statystycznego.

(Możesz zobaczyć oryginalny problem i opublikowane rozwiązanie, logując się na stronie Interviewstreet przy użyciu danych Google, a następnie przechodząc do problemu Monety na tej stronie ).

Monety Monety

Masz bezstronną monetę, którą chcesz podrzucać, dopóki nie zdobędziesz N kolejnych głów. Rzuciłeś monetą M razy i, co zaskakujące, wszystkie rzuty doprowadziły do ​​głów.

Jaka jest oczekiwana liczba dodatkowych rzutów potrzebnych do zdobycia N kolejnych głów?

Dane wejściowe:
pierwszy wiersz zawiera liczbę przypadków T. Każda kolejna linia T zawiera dwie liczby N i M.

Dane wyjściowe:
linie wyjściowe T zawierające odpowiedź dla odpowiedniego przypadku testowego. Wydrukuj odpowiedź w zaokrągleniu do dokładnie 2 miejsc po przecinku.

Przykładowe dane wejściowe:
4
2 0
2 1
3 3
3 2

Wyjście próbki:
6,00
4,00
0,00
8,00

Przykładowe objaśnienia:
Jeśli N = 2, a M = 0, musisz ciągle podrzucać monetę, aż otrzymasz 2 kolejne głowy. Nietrudno wykazać, że potrzeba średnio 6 rzutów monetą.
Jeśli N = 2 i M = 1, potrzebujesz 2 kolejnych głów i masz już 1. Musisz rzucić jeszcze raz, bez względu na wszystko. W pierwszym rzucie, jeśli zdobędziesz głowy, to koniec. W przeciwnym razie musisz zacząć od nowa, ponieważ kolejne liczniki są zerowane, i musisz w dalszym ciągu podrzucać monetę, dopóki nie otrzymasz N = 2 kolejnych głów. Oczekiwana liczba rzutów monetą wynosi zatem 1 + (0,5 * 0 + 0,5 * 6) = 4,0. Jeśli N = 3 i M = 3, masz już 3 głowy, więc nie potrzebujesz już więcej rzutów.

Wszystkie matematyczne równania, które wymyśliłem, miały poprawne odpowiedzi dla przykładowych danych wejściowych wymienionych powyżej, ale były niepoprawne dla wszystkich innych zestawów wejściowych (które nie są znane). Wydaje się, że ich programowe rozwiązanie rozwiązuje problem zupełnie inaczej niż w mojej metodzie „próbuj wymyślić równanie”. Czy ktoś może wyjaśnić, jak wymyślić równanie, które to rozwiązałoby?


1
Zobacz także tutaj, gdzie również znajduje się wynik podany przez Daniela Johnsona poniżej. 2N+12M+1
Dilip Sarwate

Odpowiedzi:


8

To ćwiczenie obliczeniowe, więc pomyśl rekurencyjnie . Obecny stan rzutu monetą zależy od uporządkowanej pary z . Niech spodziewana liczba rzutów do osiągnięcia kolejnych głów będzie równa :N M 0 N e ( N , M )(N,M)NM0Ne(N,M)

(1) Istnieje 50% szansy, że następne uderzenie będzie głową, zabierając cię do stanu , a 50% szansy, że następne uderzenie będzie ogonem, zabierając cię do stanu . To kosztuje jedno odwrócenie. Dlatego oczekiwania (rekurencyjnie) podaje( N , 0 )(N,M+1)(N,0)

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

(2) Warunki podstawowe: już to określiłeś

e(N,0)=2N+12

i oczywiście

e(N,N)=0

(nie trzeba już więcej przewracać).

Oto odpowiedni program Mathematica (w tym buforowanie wyników pośrednich w celu przyspieszenia rekurencji, co skutecznie czyni z niego dynamiczne rozwiązanie programistyczne):

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

Program wyglądałby podobnie w innych językach programowania obsługujących rekurencję. Matematycznie możemy zweryfikować, że po prostu sprawdzając rekurencję, ponieważ oczywiście dotyczy to przypadków podstawowych:e(N,M)=2N+12M+1

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

co jest prawdziwe dla każdego i , QED.NMN


Mówiąc bardziej ogólnie , to samo podejście ustali, że gdy moneta ma prawdopodobieństwo głów. Trudną częścią jest wypracowanie warunku podstawowego . Odbywa się to poprzez wyparcie rekurencji z kroków, aż w końcu zostanie wyrażone w kategoriach siebie i rozwiązanie: pe(N,0)Ne(N,0)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
Być może lepiej byłoby pracować iteracyjnie niż rekurencyjnie ? Masz co daje a więc i tak dalej dającLub równanie różnicy można rozwiązać „teoretycznie” zamiast iteracyjnie.
e(N,M)=12e(N,M+1)+12e(N,0)+1
e(N,M+1)=2e(N,M)2N+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

@Dilip Wnioski, które wyciągasz zarówno w „co daje”, jak i „itd.” Są rekurencyjne. O jakiej metodzie rozwiązania myślisz, „rozwiązując teoretycznie”?
whuber

Moim zdaniem różnica między rekurencyjnym a iteracyjnym polega na metodzie działania. Dla relacji rekurencja oblicza jako podczas gdy iteracja mówi „Teoretycznie” oznaczało rozwiązanie równania różniczkowego poprzez znalezienie charakterystycznego wielomianu, określenie jego pierwiastków, a następnie dopasowanie ogólnego rozwiązania do warunków początkowych, zamiast prostych obliczeń jak powyżej.
x(n)=2x(n1),  x(0)=1,
x(n)
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

Z punktu widzenia programowania program find_x(n)jest rekurencyjny, jeśli mówi coś takiego, if n=0 return 1 else return 2*find_x(n-1)w którym find_xwywołuje się razy, podczas gdy program iteracyjny powiedziałby coś w styluny = 1; while n > 0 do begin y=2*y; n=n-1 end; return y
Dilip Sarwate

Jeśli spojrzysz na to, jak te programy są w rzeczywistości zaimplementowane na komputerze, @Dilip, w wielu środowiskach (takich jak R) wcale się nie różnią. (W jednym przypadku tworzysz, a następnie przetwarzasz wektor, 1:naw drugim odkryjesz, że n:1został on umieszczony na stosie i przetworzony w odwrotnej kolejności). Ale część mojego punktu była konceptualna : twój początkowy komentarz mówił o „pracy iteracyjnej”. Dotyczyło to analizy, a nie żadnego programu komputerowego. Ale są to trywialne, styczne punkty, których dyskusja nie uzasadnia przedłużenia tego komentarza.
whuber

5

Aby rozwiązać ten problem, wykorzystam procesy stochastyczne, czasy zatrzymania i programowanie dynamiczne.

Po pierwsze, niektóre definicje:

Xn#(of consecutive heads after the nth flip)
również wartość dla oznaczającą liczbę kolejnych głowic przed rozpoczęciem. Tak więc, dla i sekwencji odwrotności HHTHHHTHTTHH, odpowiednie wartości wynoszą 120123010012. Gdybyśmy mieli , wartości X byłyby (M + 1) (M + 2) 0123010012.X0X0=0XX0=M

Następnie zdefiniuj następujące czasy zatrzymania:

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

wartość jest oczekiwaną wartością , liczby potrzebnych do zaobserwowania N kolejnych przerzutów , biorąc pod uwagę, że już zaobserwowaliśmy M kolejnych . Załóżmy, że ponieważ w przeciwnym razie odpowiedź brzmi 0. Obliczamy:τ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]
To pozwala nam obliczyć dwa ostatnie oczekiwania warunkowe.

Pierwszy odpowiada oczekiwanej liczbie przewrotów przed uzyskaniem ogona, przy założeniu, że ogon zostanie obrócony przed obserwowaniem N kolejnych głów, zakładając, że zaczniemy od M kolejnych głów. Nietrudno to dostrzec

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

Teraz wszystko, co musimy zrobić, to obliczyć drugie oczekiwanie warunkowe, które odpowiada oczekiwanej liczbie przerzutów potrzebnych do zaobserwowania N kolejnych główek, zaczynając od 0. Przy podobnych obliczeniach widzimy, że

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

To daje ostateczną odpowiedź:

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

Jest to zgodne z czterema wymienionymi przypadkami testowymi. Przy tak prostej odpowiedzi może być łatwiejszy sposób na obliczenie tego.


1
Jest to trudniejszy sposób na rozwiązanie tego problemu niż wymieniony powyżej pomysł rekurencyjny, ale niezwykle przydatne jest połączenie obu podejść. Większość ludzi nie docenia sposobu, w jaki metody zatrzymywania czasu mogą być stosowane również w przypadku małych, praktycznych problemów.
ely

2

Ostrzeżenie: poniższe odpowiedzi nie mogą być uważane za właściwą odpowiedź, ponieważ nie zapewniają zamkniętego formularza rozwiązania pytania, szczególnie. w porównaniu z poprzednimi odpowiedziami . Uważam jednak, że podejście to jest wystarczająco interesujące, aby wypracować rozkład warunkowy.

Rozważ wstępne pytanie o wyciągnięcie sekwencji głów z rzutów, z prawdopodobieństwem . Jest to podane przez wzór rekurencji Rzeczywiście, moje rozumowanie jest takie, że żadne kolejne głów z losowań nie mogą zostać rozłożone zgodnie z pierwszym wystąpieniem ogona z pierwszego rzuca. Uwarunkowanie tego, czy ten pierwszy ogon występuje przy pierwszym, drugim, ..., tym pociągnięciu prowadzi do tej relacji nawrotu.Nk1p(N,k)

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

Następnie prawdopodobieństwo otrzymania pierwszych kolejnych N głów w rzutach wynosi $$ q (N, m) = \ begin {przypadkach} \ dfrac {1} {2 ^ N} i \ text {if} m = N \mN

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

$$ Pierwszy przypadek jest oczywisty. drugi przypadek odpowiada ogonowi występującemu podczas losowania , a następnie głów, a ostatni przypadek zabrania kolejnych głów przed losowaniem . (Dwa ostatnie przypadki można połączyć w jeden, oczywiście!)mN1NNmN1

Prawdopodobieństwo otrzymania głów jako pierwszych i pierwszych kolejnych głów w dokładnie rzutach (i nie mniej) wynosi $$ r (M, N, m) = \ begin {przypadkach} 1/2 ^ N & \ text {if} m = N \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

\ end {przypadki} s (M, N, m) = \ begin {skrzynki} 1 / {2 ^ {NM}} i \ text {if} m = N \ 0 & \ text {if} N \ sum_ {r = M + 1} ^ {N} \ dfrac {q (N, mr)} {2 ^ {rM }} i \ text {if} N + M

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

\ end {przypadki} \ mathfrak {E} (M, N) = \ sum_ {m = N} ^ \ infty m \, s (M, N, m) $$ lub za liczbę dodatkowych kroków ...E ( M , N ) - M

Theexpectednumberofdrawscanthenbederivedby
E(M,N)M
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.