Nie jestem pewien, jak skutecznie podsumować warunki, ale możemy zatrzymać się, gdy całkowita liczba rzutów i całkowita liczba sukcesów t są takie, że ( nnt jest nawet, ponieważ możemy podzielić różne uporządkowania, które moglibyśmy osiągnąćnit,na dwie grupy o jednakowym prawdopodobieństwie, z których każda odpowiada innej wyjściowej etykiecie. Musimy uważać, aby nie zatrzymać się jeszcze dla tych elementów, tzn. Że żaden element nie ma prefiksu o długościn′zsukcesamit′takimi, że ( n′(nt)ntn′t′jest parzysty. Nie jestem pewien, jak zmienić to w oczekiwaną liczbę rzutów.(n′t′)
Ilustrować:
Możemy zatrzymać się na TH lub HT, ponieważ mają one równe prawdopodobieństwo. Przechodząc w dół trójkąta Pascala, kolejne parzyste wyrażenia znajdują się w czwartym rzędzie: 4, 6, 4. Oznacza to, że możemy zatrzymać się po rzutach, jeśli pojawi się jedna głowa, ponieważ możemy stworzyć dwustronne dopasowanie: HHHT z HHTH i technicznie HTHH z THHH, chociaż już byśmy się na tym zatrzymali. Podobnie daje dopasowanie HHTT do TTHH (reszta byłaby już zatrzymana przed osiągnięciem ich).(42)
Dla , wszystkie sekwencje zatrzymały prefiksy. To staje się nieco bardziej interesujące w ( 8(52) gdzie dopasowujemy FFFFTTFT do FFFFTTTF.(83)
Dla po 8 rzutach, szansa, że się nie zatrzymasz, wynosi1p=12 z oczekiwaną liczbą rzutów, jeśli zatrzymamy się na531128 . W przypadku rozwiązania, w którym pary są zmienne, dopóki się nie różnią, szansa, że się nie zatrzymamy, wynosi15316 z oczekiwaną liczbą rzutów, jeśli zatrzymaliśmy się na 4. Według rekurencji górna granica oczekiwanych rzutów dla prezentowanego algorytmu wynosi128116. 128127⋅5316=424127<4
Napisałem program w Pythonie, aby wydrukować punkty zatrzymania:
import scipy.misc
from collections import defaultdict
bins = defaultdict(list)
def go(depth, seq=[], k=0):
n = len(seq)
if scipy.misc.comb(n, k, True) % 2 == 0:
bins[(n,k)].append("".join("T" if x else "F"
for x in seq))
return
if n < depth:
for i in range(2):
seq.append(i)
go(depth, seq, k+i)
seq.pop()
go(8)
for key, value in sorted(bins.items()):
for i, v in enumerate(value):
print(v, "->", "F" if i < len(value) // 2 else "T")
print()
drukuje:
FT -> F
TF -> T
FFFT -> F
FFTF -> T
FFTT -> F
TTFF -> T
TTFT -> F
TTTF -> T
FFFFFT -> F
FFFFTF -> T
TTTTFT -> F
TTTTTF -> T
FFFFFFFT -> F
FFFFFFTF -> T
FFFFFFTT -> F
FFFFTTFF -> T
FFFFTTFT -> F
FFFFTTTF -> T
FFFFTTTT -> F
TTTTFFFF -> T
TTTTFFFT -> F
TTTTFFTF -> T
TTTTFFTT -> F
TTTTTTFF -> T
TTTTTTFT -> F
TTTTTTTF -> T