Czym właściwie jest rzut monetą?
Rzut monetą to oryginalny losowy bit. Orzeł albo reszka, 50/50, decyzja w czasie, w którym moneta zatoczy obrót w powietrzu. Ludzie rozstrzygają tak spory i remisy od czasów rzymskich, kiedy mówili navia aut caput — statek albo głowa — od wzorów na brązowych monetach. Matematyka się od tego czasu nie zmieniła.
Zmieniło się to, że prawdopodobnie nie nosisz już monety przy sobie. Cyfrowy rzut musi zasymulować ten sam uczciwy, nieprzewidywalny wynik 50/50 bez żadnej fizycznej monety. Brzmi trywialnie. Przeważnie nie jest, bo większość oprogramowania używa generatorów liczb losowych, które wcale nie są losowe — to sekwencje, które wyglądają losowo, dopóki nie znasz wzoru.
Ten Rzut monetą używa crypto.getRandomValues(), kryptograficznie bezpiecznego generatora liczb losowych w przeglądarce. To samo źródło, którego banki używają do tokenów sesyjnych. Każdy rzut wyciąga świeży bajt z puli entropii systemu operacyjnego i redukuje go do pojedynczego bitu. Bez seeda, bez wzorca, bez sposobu na przewidzenie kolejnego wyniku z poprzednich. Tak uczciwe, jak uczciwa moneta może być.
Jak używać Rzutu monetą
Otwórz Rzut monetą i wciśnij rzuć. To wszystko.
- Wciśnij przycisk rzutu (albo naciśnij spację)
- Zobacz wynik: orzeł albo reszka
- Wciśnij znowu, by rzucić następny raz — licznik śledzi sumę bieżącą
- Zresetuj licznik, gdy chcesz zacząć od nowa
Suma bieżąca przydaje się każdemu, kto jest ciekaw, czy rzuty są naprawdę zbalansowane. Po 100 rzutach powinieneś zobaczyć coś bliskiego 50/50 — ale prawdopodobnie nie dokładnie 50/50. Za chwilę dotrzemy do tego, dlaczego.
crypto.getRandomValues kontra Math.random — czemu to ważne
JavaScript ma dwa sposoby na uzyskanie losowej liczby i nie są równoważne.
Math.random() to generator pseudolosowych liczb. Produkuje deterministyczną sekwencję z ukrytego stanu wewnętrznego. Sekwencja wygląda losowo i dla większości zastosowań — losowania animacji, wybierania losowego koloru wykresu — jest w porządku. Ale nie jest nieprzewidywalna. Dwie strony uruchamiające ten sam generator z tego samego stanu początkowego wyprodukowałyby te same „losowe” liczby. Wyjście jest też subtelnie obciążone w sposób, który ma znaczenie tylko na dużą skalę.
crypto.getRandomValues() wyciąga bajty z kryptograficznie bezpiecznej puli entropii systemu operacyjnego. Na nowoczesnym sprzęcie tę pulę zasilają szum termiczny, ruchy myszy, czasy przyjścia pakietów sieciowych i pół tuzina innych fizycznych źródeł. Nie ma wewnętrznego stanu, który mógłby wyciec, ani sekwencji, którą można przewidzieć. To to samo źródło, którego używa przeglądarka, gdy generuje klucz TLS.
Dla rzutu monetą różnica rzadko ma znaczenie w pojedynczym rzucie. Ma ogromne znaczenie przy milionach rzutów — to jedyny kontekst, w którym zauważysz obciążony generator. Używamy crypto.getRandomValues(), bo nie ma powodu, by nie używać — obie funkcje zajmują z grubsza tyle samo czasu, a jedna z nich daje Ci gwarancję uczciwości, którą możesz zweryfikować.
Jeśli chcesz to sam sprawdzić, otwórz konsolę przeglądarki na stronie Rzutu monetą i uruchom crypto.getRandomValues(new Uint8Array(1)). Dostaniesz liczbę między 0 a 255. Bierzemy tę liczbę, sprawdzamy, czy jest parzysta, czy nieparzysta (lub równoważnie — czy najmłodszy bit to 0, czy 1), i ten pojedynczy bit decyduje: orzeł czy reszka.
Problem serii: dlaczego 10 rzutów rzadko wygląda „losowo”
Oto eksperyment, który większość ludzi rozumie błędnie. Rzuć monetą 10 razy. Zapisz wyniki. Pokaż je koledze. Zapytaj: „czy to wygląda losowo?”.
Jeśli sekwencja to O R O R O O R O R R, większość ludzi powie tak. Jeśli to O O O O R O O R R R, większość powie nie — za dużo orłów pod rząd, to nie może być losowe. Obie sekwencje są równie prawdopodobne. Obie mają ten sam ogólny stosunek orłów i reszek. Druga po prostu wygląda mniej losowo, bo ludzie poważnie niedoceniają, jak często serie występują w prawdziwych danych losowych.
Przykład z życia. Rzuciliśmy tym Rzutem monetą dziesięć razy. Oto rzeczywista sekwencja, którą dostaliśmy:
O, O, R, O, O, O, R, R, R, O
Sześć orłów, cztery reszki. Najdłuższa seria orłów: 3 pod rząd (rzuty 4–6). Najdłuższa seria reszek: 3 pod rząd (rzuty 7–9).
Wygląda na ustawione, prawda? Nie jest. Prawdopodobieństwo uzyskania co najmniej jednej serii 3 lub więcej w 10 rzutach uczciwej monety to około 82%. Większość dziesięciorzutowych sekwencji zawiera tak długą serię. Jeśli jej nie widzisz, to dopiero jest nietypowy wynik.
Oto przybliżone prawdopodobieństwa zobaczenia różnych maksymalnych długości serii w sekwencji 10 rzutów:
| Najdłuższa seria jednej strony w 10 rzutach | Przybliżone prawdopodobieństwo | Jak to wygląda |
|---|---|---|
| 1 pod rząd (idealna alternacja, np. O R O R O R O R O R) | ≈ 0,2% | Tak nieprawdopodobne, że prawie nigdy nie zdarza się przy uczciwej monecie |
| Najwyżej 2 pod rząd | ≈ 7% | Rzadkie; ludzkiemu oku wyda się „bardzo losowe” |
| Najwyżej 3 pod rząd | ≈ 38% | Częste — typowa sekwencja „wygląda losowo” |
| 4 pod rząd co najmniej raz | ≈ 45% | Niemal sam rzut monetą; ludziom wydaje się „obciążone”, choć nie jest |
| 5 lub więcej pod rząd co najmniej raz | ≈ 22% | Mniej więcej 1 na 5 sekwencji 10 rzutów; wygląda na ewidentnie ustawione |
| 6 lub więcej pod rząd co najmniej raz | ≈ 11% | 1 na 9; zaskakująco częste |
Wniosek: długie serie nie są dowodem zepsutej monety. Są dowodem normalnej monety. Gdybyś rzucił 100 razy i nigdy nie dostał serii 5 lub więcej w żadną stronę, to byłby zaskakujący wynik.
Złudzenie gracza
Rzucasz orła cztery razy pod rząd. Jaka szansa, że następny rzut to reszka?
50%. Tak samo jak przy każdym innym rzucie. Moneta nie pamięta poprzednich wyników. Nie może Ci „być winna” reszki. To złudzenie gracza — intuicja, że poprzednie wyniki losowe wpływają na przyszłe — i jedno z najdroższych poznawczych błędów, jakie ludzie popełniają. Kasyna od niego zależą.
Każdy rzut monetą jest niezależny. Prawdopodobieństwo OOOOO (pięć orłów pod rząd) na początku sekwencji to 1/32. Ale prawdopodobieństwo dostania kolejnego orła po już wyrzuconych OOOO to ciągle 1/2. Wcześniejsze rzuty się zdarzyły. Nie wpływają na następny.
To ma znaczenie dla każdego uczciwego użycia rzutu monetą. Jeśli używasz rzutów do podjęcia decyzji — zamówić pizzę czy sushi? — nie rzucaj wielokrotnie, aż dostaniesz odpowiedź, której chciałeś. To psuje cały sens zostawienia decyzji losowi. Rzuć raz, zaakceptuj wynik.
Do czego ludzie naprawdę używają rzutu monetą
Rzut monetą służy do więcej niż rozstrzygania remisów. Kilka częstych przypadków:
- Decyzja między dwoma opcjami. Pizza czy sushi. Film A czy film B. Klasyczne użycie i ciągle najlepsze. Dwa wyniki, równa waga, bez przekombinowania.
- Usuwanie własnego uprzedzenia w trudnym wyborze. Jeśli rzucasz monetą i od razu czujesz rozczarowanie wynikiem, czegoś się dowiedziałeś — już wiedziałeś, której opcji chciałeś. Rzut wydobywa preferencje, do których się nie przyznawałeś.
- Rozstrzyganie gier i sportu. Wprowadzenie w futbolu, serwis w tenisie, pierwszy wybór w drafcie. Monety decydują, kto zaczyna, w praktycznie każdej strukturze zawodów wymyślonej przed komputerami.
- Próbkowanie losowe. „Rzuć monetą — jeśli orzeł, włącz ten wiersz do próbki”. Szybki sposób na 50% losową próbkę z czegokolwiek.
- Nauka rachunku prawdopodobieństwa. Rzuty monetą to najczystszy szkolny przykład niezależnych prób, wartości oczekiwanej i prawa wielkich liczb. Wykonaj sto i patrz, jak stosunek się zbiega.
Dla decyzji z więcej niż dwiema opcjami będziesz potrzebować innego narzędzia. Dice Roller obsługuje 4, 6, 8 albo 20 wyników. Random Name Picker wybiera jedną pozycję z listy. List Randomizer przetasowuje całą listę w losowej kolejności.
A „najlepszy z trzech”?
Jeśli pojedynczy rzut wydaje się zbyt zmienny, „najlepszy z trzech” zmniejsza szum. Trzy rzuty i pierwsza strona, która dojdzie do 2, wygrywa. Prawdopodobieństwo wygranej każdej strony nadal wynosi 50% — moneta jest ta sama — ale rozkład możliwych wyników jest węższy.
Matematyka: „najlepszy z trzech” to po prostu „pierwszy do 2 orłów lub 2 reszek w serii niezależnych rzutów”. Któraś strona wygrywa, gdy tylko dostanie drugą sztukę. Większość serii kończy się po 2 rzutach (prawdopodobieństwo 50%), reszta po 3 (prawdopodobieństwo 50%).
Przykład: Ty i kolega chcecie ostatni kawałek pizzy. Pojedynczy rzut — zaakceptowałbyś wynik, ale może z burczeniem. Najlepszy z trzech wydaje się sprawiedliwszy, bo nie można przegrać na pierwszym rzucie. Oczekiwany wynik jest identyczny; subiektywna sprawiedliwość — wyższa. Użyj tego, co woli Twoja grupa — matematycznie obie wersje są w porządku.
Powiązane narzędzia losowości
Rzut monetą to najprostszy przypadek „potrzebuję losowego wyniku teraz”. Kilka powiązanych Microappów dla bogatszych przypadków:
- Dice Roller — dla więcej niż dwóch wyników. Rzuć dowolną liczbą kostek z 2, 4, 6, 8, 10, 12, 20 lub 100 ścianami.
- List Randomizer — wklej listę, dostań ją z powrotem w losowej kolejności. Dobre do tasowania kolejności prezentacji, kolejki lub czegokolwiek, co trzeba uczciwie ustawić.
- Random Name Picker — wybierz jedną pozycję z listy. Klasyczne „wybierz zwycięzcę”.
- Team Generator — podziel listę osób na zrównoważone losowe zespoły. Przydatne do sportu, grup nauki albo dzielenia klasy.
- Password Generator — używa tego samego kryptograficznego źródła losowości do prawdziwego wyjścia klasy bezpieczeństwa.
Najczęściej zadawane pytania
Czy ten Rzut monetą jest naprawdę 50/50?
Tak. Każdy rzut wyciąga losowy bajt z crypto.getRandomValues() i sprawdza, czy jest parzysty, czy nieparzysty. Funkcja to kryptograficznie bezpieczny RNG przeglądarki, ten sam, który generuje klucze sesyjne TLS. Obciążenie byłoby mierzalne w milionach rzutów; nie znajdziesz żadnego.
Wyrzuciłem orła 7 razy pod rząd. Moneta jest zepsuta?
Nie. Prawdopodobieństwo dowolnej konkretnej sekwencji 7 rzutów (w tym OOOOOOO) to 1/128 — około 0,8%. Jeśli rzucisz 100 razy, prawdopodobnie zobaczysz tak długą serię gdzieś w sekwencji. Serie nie znaczą, że moneta jest obciążona; znaczą, że moneta jest normalna.
Dlaczego moja suma bieżąca odpływa od 50/50?
Sekwencje losowe mają to, co statystycy nazywają dryfem błądzenia losowego. Po 100 rzutach liczba zwykle nie będzie 50/50 — będzie gdzieś w okolicach 40–50 z każdej strony. Po 10 000 rzutów będzie znacznie bliżej w wartościach względnych (powiedzmy 5021 vs 4979), ale bezwzględna różnica może ciągle być w dziesiątkach. Zbieżność jest w stosunku, nie w bezwzględnej liczbie. To prawo wielkich liczb i jest powolne.
Czy mogę rzucać monetą obciążoną (60/40 albo 70/30)?
Rzut monetą jest z założenia tylko uczciwy. Dla ważonych wyborów losowych użyj Dice Roller z większą kostką i zdefiniuj własne zakresy (np. rzuć d10; 1–6 znaczy opcja A, 7–10 znaczy opcja B — to podział 60/40). Wbudowanie „obciążonej monety” w rzut monetą zaciemnia to, co robi narzędzie. Jedno zadanie na Microapp.
Czy Rzut monetą działa offline?
Tak, gdy strona jest już załadowana. Generator liczb losowych działa w całości w Twojej przeglądarce; nic z rzutu nie opuszcza Twojego urządzenia. Bez żądania sieciowego, bez serwera, bez śledzenia. Otwórz raz, odepnij wi-fi, rzucaj dalej.
Czy mogę użyć tego do drabinki turniejowej albo ważnej decyzji?
Losowość jest uczciwa. Dla decyzji wysokiej stawki, gdzie przegrany może kwestionować wynik, rozważ wykonanie rzutu w obecności świadka patrzącego na ekran albo zrób zrzut ekranu wyniku z widocznym znacznikiem czasu. Moneta nie kłamie, ale dowód społeczny, że rzut miał miejsce, może mieć znaczenie, gdy wynik niesie konsekwencje.
Czemu nie użyć fizycznej monety?
Użyj, jeśli masz. Fizyczne monety są w porządku, z drobnym zastrzeżeniem — badania sugerują, że prawdziwe monety mają bardzo lekkie obciążenie do lądowania na tej samej stronie, na której wystartowały (około 51/49), z powodu tego, jak chybocą się w powietrzu. Ten Rzut monetą nie ma „strony startowej”, więc właściwie jest minimalnie sprawiedliwszy niż fizyczna moneta. Ale w 10 rzutach nie zauważysz różnicy.