Do oszacowania tych prawdopodobieństw użyjemy metody Monte Carlo. W artykule postaram się pokazać:
* na czym polega metoda Monte Carlo i dlaczego jest piękna,
* jak ją zaprogramować w R,
* jak sprawdzić, czy wyniki mają sens,
* jak ocenić, czy liczba symulacji jest wystarczająca.
Najpierw przypomnijmy sobie, jak wygląda plansza do gry Eurobiznes (rys. 1). Składa się ona z 40 pól numerowanych od 1 (pole "Start") do 40 ("Wiedeń"). Mamy jedno pole, które zmienia położenie (31, "Idziesz do więzienia") i sześć, które potencjalnie zmieniają położenie (karty szans: 16 niebieskich i 16 czerwonych). Będziemy je dalej nazywać polami specjalnymi. Oprócz tego, jeżeli w wyniku rzutu kostkami otrzymamy na obu taką samą liczbę oczek, rzucamy jeszcze raz, przemieszczając się o tyle pól, ile w sumie wypadło oczek w obu rzutach. jeżeli jednak ponownie coś takiego się wydarzy, idziemy do więzienia, czyli na pole 11.
![euro.webp](/uploads/euro_e8b422e3ed.webp)
Jak policzyć prawdopodobieństwa zatrzymania się na poszczególnych polach? Możemy rzucać kostką i zapisywać, gdzie stanęliśmy. jeżeli się uprzemy i zrobimy to naprawdę dużo razy, szukane prawdopodobieństwo otrzymamy, dzieląc liczbę przypadków zatrzymania się na danym polu przez liczbę wszystkich rzutów. To jest istota metody Monte Carlo. Chodzi tylko o to, by zamiast samemu rzucać kostką, zmusić do tego komputer.
Napiszmy pseudokod, który coś takiego zrealizuje. Dla prostoty będziemy grali sami ze sobą, gdyż interakcje między graczami i tak nie zmieniają położenia.
```r
# ustaw się na polu start
# powtarzaj N razy:
# rzuć dwiema kostkami
# jeżeli liczba oczek nie jest taka sama, przesuń się o sumę oczek
# w przeciwnym wypadku rzuć jeszcze raz
# jeżeli liczba oczek nie jest taka sama, przesuń się o sumę oczek z obu rzutów
# w przeciwnym wypadku idziesz do więzienia
# jeżeli trafiłeś na pole specjalne, zmień pozycje
# zapamiętaj, w jakim polu się znalazłeś
```
Zacznijmy od uproszczonej wersji, która nie będzie uwzględniać pól specjalnych. Pamiętajmy, iż chodzimy w kółko, także po polu 40 następuje pole 1, a nie 41 (dlatego będziemy dzielić modulo 40). Trzeba jeszcze uważać, gdyż `40 %% 40 = 0`, zatem pozycję 0 należy zmienić na 40. W poniższym kodzie tworzymy 40-elementowy wektor wypełniony zerami i jeżeli staniemy na przykład na polu 10, zwiększymy o jeden 10. element tego wektora. Uwaga, poniższy kod nie jest napisany optymalnie (to znaczy tak, by całość wykonała się jak najszybciej), ale nacisk został położony na czytelność.
```r
N