Jakiej oczekiwanej liczby razy musisz rzucić kostką, aż każda ze stron pojawi się 3 razy?
To pytanie zostało zadane w szkole podstawowej w Nowej Zelandii i zostało rozwiązane za pomocą symulacji. Jakie jest analityczne rozwiązanie tego problemu?
Jakiej oczekiwanej liczby razy musisz rzucić kostką, aż każda ze stron pojawi się 3 razy?
To pytanie zostało zadane w szkole podstawowej w Nowej Zelandii i zostało rozwiązane za pomocą symulacji. Jakie jest analityczne rozwiązanie tego problemu?
Odpowiedzi:
Załóżmy, że wszystkie stron mają równe szanse. oczekiwaną liczbę potrzebnych rzutów, aż strona się razy, strona się razy, ..., a strona się razy. Ponieważ tożsamość stron nie ma znaczenia (wszystkie mają równe szanse), opis tego celu można : załóżmy, że strony wcale nie muszą się pojawiać, strony muszą pojawić się tylko raz , ... i boków muszą pojawić się razy. Pozwolićd=6 1 n1 2 n2 d nd i0 i1 in n=max(n1,n2,…,nd) e ( i ) e ( 0 , 0 , 0 , 6 )
Dostępna jest łatwa rekurencja. Na następnej stronie rolki, które się pojawi, odpowiada jeden z : To znaczy, że albo nie trzeba go zobaczyć, czy potrzebujemy go zobaczyć raz, ..., lub co potrzebne, aby go zobaczyć razy więcej . to ile razy potrzebowaliśmy to zobaczyć. n jij n jot
Gdy , nie musieliśmy tego widzieć i nic się nie zmienia. Dzieje się tak z prawdopodobieństwem .i 0 / dj = 0 ja0/ d
Kiedy musieliśmy zobaczyć tę stronę. Teraz jest o jedną stronę mniejszą niż raz i jeszcze jedną stronę, którą trzeba zobaczyć razy. Zatem staje się a staje się . Niech ta operacja na komponentach zostanie oznaczona , tak abyj j - 1 i j i j - 1 i j - 1 i j + 1 i i ⋅ jj > 0 jot j - 1 jajot jajot- 1 jaj -1 jajot+ 1 ja I ⋅j
Dzieje się tak z prawdopodobieństwem .jajot/ d
Musimy tylko policzyć ten rzut kości i użyć rekurencji, aby powiedzieć nam, ile oczekiwanych jest rzutów. Według praw oczekiwania i całkowitego prawdopodobieństwa,
(Rozumiemy, że ilekroć , odpowiedni warunek w sumie wynosi zero).ij=0
Jeśli , to skończymy, a . W przeciwnym razie możemy rozwiązać dla , podając żądaną formułę rekurencyjnąe ( i ) = 0 e ( i )i0=d e(i)=0 e(i)
Zauważ, że to łączna liczba zdarzeń, które chcemy zobaczyć. Operacja zmniejsza tę liczbę o jeden dla dowolnego pod warunkiem, że , co zawsze ma miejsce. Dlatego ta rekurencja kończy się na głębokości dokładnie(równa w pytaniu). Ponadto (co nie jest trudne do sprawdzenia) liczba możliwości na każdej głębokości rekurencji w tym pytaniu jest niewielka (nigdy nie przekracza ). W związku z tym jest to skuteczna metoda, przynajmniej wtedy, gdy możliwości kombinatoryczne nie są zbyt liczne, a my zapamiętujemy wyniki pośrednie (tak aby żadna wartość⋅ j j > 0 i j > 0 | i | 3 ( 6 ) = 18 8 e
Obliczam, że
Wydawało mi się to okropnie małe, więc przeprowadziłem symulację (używając32,669 0,027
R
). Po ponad trzech milionach rzutów kostką gra została ukończona ponad 100 000 razy, przy średniej długości . Standardowy błąd tego oszacowania wynosi : różnica między tą średnią a wartością teoretyczną jest nieznaczna, co potwierdza dokładność wartości teoretycznej.0,027Interesujący może być rozkład długości. (Oczywiście musi zaczynać się od , minimalna liczba rzutów potrzebna do zebrania wszystkich sześciu stron trzy razy każda).18
Realizacja
Chociaż rekurencyjne obliczanie jest proste, stanowi pewne wyzwanie w niektórych środowiskach obliczeniowych. Najważniejszym z nich jest przechowywanie wartości podczas ich obliczania. Jest to niezbędne, ponieważ w przeciwnym razie każda wartość zostanie (nadmiarowo) obliczona bardzo wiele razy. Jednak pamięć potencjalnie potrzebna dla tablicy indeksowanej przez może być ogromna. Idealnie powinny być przechowywane tylko wartości , które faktycznie występują podczas obliczeń. Wymaga to pewnego rodzaju tablicy asocjacyjnej.mi e ( i ) ja ja
Aby to zilustrować, oto działającyja I ⋅j
R
kod. Komentarze opisują utworzenie prostej klasy „AA” (tablica asocjacyjna) do przechowywania wyników pośrednich. Wektory są konwertowane na ciągi, które służą do indeksowania do listy, która będzie zawierać wszystkie wartości. Operacja jest zaimplementowana jako .E
%.%
Te czynności wstępne umożliwiają raczej zdefiniowanie funkcji rekurencyjnej w sposób podobny do zapisu matematycznego. W szczególności liniami
jest bezpośrednio porównywalny z powyższym wzorem . Zauważ, że wszystkie indeksy zostały zwiększone o ponieważ zaczyna indeksować swoje tablice od zamiast .( 1 ) 1 1 0
R
Czas pokazuje, że obliczenie zajmuje sekundy ; jego wartość to0,01
e(c(0,0,0,6))
Skumulowany błąd zaokrąglenia zmiennoprzecinkowego zniszczył dwie ostatnie cyfry (które powinny być
68
raczej niż06
).Wreszcie, oto oryginalna implementacja Mathematica, która dała dokładną odpowiedź. Zapamiętywanie odbywa się za pomocą
e[i_] := e[i] = ...
wyrażenia idiomatycznego , eliminując prawie wszystkie czynnościR
wstępne. Jednak wewnętrznie oba programy robią te same rzeczy w ten sam sposób.źródło
Oryginalna wersja tego pytania rozpoczęła życie od zadania:
Oczywiście jest to pytanie, na które nie ma odpowiedzi, jak to skomentował @JuhoKokkala: odpowiedź jest zmienną losową z rozkładem, który należy znaleźć. Pytanie zostało następnie zmodyfikowane, aby zapytać: „Jaka jest oczekiwana liczba rzutów”. Poniższa odpowiedź ma na celu odpowiedzieć na postawione pierwotne pytanie: jak znaleźć rozkład liczby rolek bez korzystania z symulacji i po prostu przy użyciu prostych koncepcyjnie technik, które każdy student z Nowej Zelandii za pomocą komputera mógłby wdrożyć prawo Dlaczego nie? Problem sprowadza się do 1-liniowej.→
Rozkład liczby wymaganych rolek ... tak, że każda strona pojawia się 3 razy
Rzucamy kostką razy. Niech oznacza, ile razy pojawia się strona matrycy, gdzie . Zatem wspólnym pmf dla jest tj . :n Xja ja i ∈ { 1 , … , 6 } ( X1, X2), … , X6) Wielomian ( n , 16)
Niech:Zatem cdf z to:N.= min { n :Xja≥ 3∀ja} . N. P.( N≤ n )=P.( X∀ja≥ 3∣∣n )
tzn. Aby znaleźć cdf , po prostu oblicz dla każdej wartości :P.( N≤ n ) n = { 18 , 19 , 20 , … }
Oto na przykład kod Mathematica , który to robi, gdy wzrasta z 18 do 60. Jest to w zasadzie jednowierszowy:n
... co daje dokładny plik cdf w miarę wzrostu :n
Oto wykres cdf , w funkcji :P.( N≤ n ) n
Aby uzyskać pmf , po prostu najpierw rozróżnij plik cdf:P.( N= n )
Oczywiście rozkład nie ma górnej granicy, ale możemy tutaj łatwo rozwiązać tyle wartości, ile jest praktycznie wymagane. Podejście to jest ogólne i powinno działać równie dobrze dla każdej wymaganej kombinacji wymaganych stron.
źródło