Uczciwość losowania, czyli najpierw wynik, potem animacja
Większość kół fortuny w internecie działa odwrotnie. Nadaje kołu losową prędkość, symuluje tarcie i sprawdza, gdzie koło się zatrzymało. Wygląda to naturalnie, ale rozkład wyników zależy wtedy od parametrów symulacji, a nie od czystego losowania. Drobne błędy zaokrągleń albo zależność kąta startowego od poprzedniego obrotu potrafią przechylić szanse o kilka procent, co przy losowaniu nagrody jest już różnicą, którą ktoś może zakwestionować.
Tutaj kolejność jest odwrócona i widać to w kodzie strony. Najpierw pytamy generator liczb losowych wbudowany w przeglądarkę, czyli crypto.getRandomValues, który segment wygrywa. Dopiero potem JavaScript wylicza, o ile stopni obrócić koło, żeby strzałka wskazała właśnie ten segment, i dokłada od pięciu do siedmiu pełnych obrotów, aby ruch wyglądał jak prawdziwe kręcenie. Cała losowość mieści się w jednym wywołaniu generatora, a animacja jest oprawą tego, co zapadło w chwili kliknięcia.
Skoro kąt zatrzymania wynika z wcześniej wylosowanego segmentu, ani siła kliknięcia, ani moment puszczenia przycisku, ani czas trzymania palca na ekranie nie zmieniają wyniku, a jedynym miejscem, w którym rozstrzyga się losowanie, pozostaje ta jedna linijka skryptu, którą każdy może obejrzeć w źródle strony.
Jak działają wagi segmentów
Bez wag każdy segment ma równy kąt i równe szanse: przy ośmiu pozycjach każda dostaje 45 stopni i 12,5% prawdopodobieństwa. Po włączeniu wag kąt segmentu rośnie proporcjonalnie do wagi, a losowanie odbywa się w przestrzeni sumy wag. Jeśli trzy pozycje mają wagi 1, 1 i 3, suma wynosi 5, a szanse wynoszą 20%, 20% i 60%. Proporcje pól na kole wychodzą dokładnie takie same.
Waga musi być liczbą dodatnią. Zero albo tekst po kresce pionowej cofa pozycję do wagi 1, żeby na kole nie pojawił się segment z zerową szansą, który mimo to zajmuje miejsce. Wagi są jedyną funkcją zmieniającą prawdopodobieństwo, więc przy wyłączonym przełączniku „Wagi segmentów” wszystkie pozycje mają identyczne szanse.
Konfiguracja koła zapisana w adresie strony
Lista pozycji trafia do adresu jako jeden parametr zakodowany w base64 w odmianie bezpiecznej dla adresów URL. Link można wkleić do wiadomości bez obawy o polskie znaki, a serwis nie zapamiętuje niczego po swojej stronie. Nie ma bazy kół, nie ma identyfikatorów, nie ma retencji. Otwarcie linku odtwarza listę w przeglądarce odbiorcy, bo to JavaScript dekoduje parametr i wpisuje pozycje do pola tekstowego.
Lista siedzi w adresie za znakiem #, czyli we fragmencie. To rozróżnienie ma tu znaczenie praktyczne: fragmentu przeglądarka nie dokłada do żądania HTTP, więc pozycje nie docierają do serwera ani do jego dzienników nawet wtedy, gdy ktoś roześle link dalej. Listę składa dopiero skrypt po stronie odbiorcy. Wcześniej nośnikiem był parametr zapytania, który trafiał do dzienników razem z każdym żądaniem, i dlatego go zmieniliśmy. Linki rozesłane przed tą zmianą działają dalej.
Wadę takiego zapisu widać od razu, bo link rośnie razem z listą. Dwadzieścia imion daje adres długości około dwustu znaków, a kilkaset pozycji rozdmucha go do kilku tysięcy.
Zastosowania koła fortuny, od gier planszowych po losowanie nagród
Najczęściej koło wskazuje osobę. Wpisujesz imiona albo nazwiska uczestników, kręcisz kołem i masz zwycięzcę konkursu, ochotnika do odpowiedzi na lekcji albo gracza, który zaczyna partię. W grach planszowych koło kończy spór o to, kto rusza pierwszy, a w dłuższych rozgrywkach wskazuje, kto wykonuje karę. Angielskie nazwy tego typu narzędzi, spin the wheel i random wheel, opisują dokładnie tę samą mechanikę.
Druga grupa zastosowań to nagrody. Koło fortuny do losowania nagród z wagami odwzorowuje pulę, w której nagroda główna wypada rzadziej niż drobiazg, a zatrzymanie strzałki robi z rozdania niespodziankę dla całej sali. Uczestnicy widzą proporcje pól, więc jeszcze przed kręceniem wiedzą, jak rozkładają się szanse między wygranymi.
Trzecia grupa to sytuacje wymagające podejmowania decyzji, przy których nikt nie ma zdania: co na obiad, kto zmywa, dokąd na weekend. Koło pomaga wybrać jedną odpowiedź w kilka sekund i przy okazji bawi, bo wirujące pole przypomina ruletkę, a decyzja przestaje być czyjąś winą.
Ile pozycji ma sens na kole
Technicznie koło przyjmuje do pięciuset pozycji i nadal obraca się płynnie, bo cała grafika powstaje na płótnie w jednym przebiegu rysowania. Czytelność wysiada wcześniej. Przy trzydziestu segmentach podpisy robią się drobne, powyżej stu znikają zupełnie i zostają same numery, a pełną nazwę zwycięzcy i tak pokazuje okno po zatrzymaniu koła.
Przy bardzo długiej liście koło jest już tylko oprawą, bo wynik wyjdzie identyczny jak w prostszym narzędziu do losowania z listy. Różnica sprowadza się do tego, że koło da się pokazać publiczności.