Losowość wyniku i tasowanie Fisher-Yates
Algorytm przechodzi listę od końca do początku. Dla każdej pozycji i losuje indeks j z przedziału od zera do i i zamienia oba elementy miejscami. Każdy z tych indeksów pochodzi z crypto.getRandomValues, czyli z generatora liczb losowych wbudowanego w przeglądarkę i zasilanego entropią zebraną przez system na Twoim urządzeniu. Po jednym przejściu każda z możliwych kolejności listy jest równie prawdopodobna, a dowód tej własności sprowadza się do prostej indukcji po długości listy.
Popularna alternatywa, czyli sortowanie listy z losowym komparatorem, tej własności nie ma. Wynik zależy wtedy od algorytmu sortowania użytego w przeglądarce i potrafi wyraźnie faworyzować pewne układy. Dlatego w tym narzędziu do losowania sortowania po losowej wartości nie znajdziesz, a cały kod JavaScript odpowiedzialny za wybór zwycięzcy mieści się w kilkunastu linijkach, które można podejrzeć w źródle strony.
Losowanie bez powtórzeń i z powtórzeniami
Tryb bez powtórzeń tasuje całą listę i bierze pierwszych N pozycji. Odpowiada to losowaniu z urny, z której wyciągniętych kartek się nie zwraca, więc każde imię może wypaść najwyżej raz. W ten sposób przeprowadza się losowanie zwycięzcy konkursu i losowanie kolejności wystąpień.
Wariant z powtórzeniami losuje każdą pozycję niezależnie z pełnej listy, czyli kartkę za każdym razem wrzuca z powrotem. Tak wybiera się na przykład zadanie dla kolejnych uczniów do odpowiedzi. Przy krótkiej liście powtórzenia w wyniku zdarzają się często, bo przy trzydziestu pozycjach i pięciu losowaniach szansa, że coś się powtórzy, wynosi blisko 30%.
Do czego przydaje się losowanie imion online
Najczęściej trafiają tu osoby, które organizują konkurs w mediach społecznościowych i muszą wskazać zwycięzcę spośród kilkuset komentarzy, ale ten sam selektor, choć brzmi to prozaicznie, równie dobrze przydziela role w grze planszowej albo ustala kolejność prezentacji w klasie.
Nauczyciele losują uczniów do odpowiedzi, a trenerzy dzielą zawodników na drużyny. Na spotkaniu towarzyskim ten sam mechanizm wskazuje, kto opowiada pierwszy. W każdym z tych zastosowań liczy się to samo, czyli niezależność wyniku od sympatii osoby prowadzącej.
Narzędzie działa jak generator losowych imion ograniczony do Twojej listy, czyli wybiera spośród wpisanych pozycji. Nowe imiona, których nikt wcześniej nie wpisał, układa generator imion fantasy. Jeśli losowanie ma być interaktywne i chcesz udostępnić je publiczności na ekranie, weź koło fortuny, które pokazuje ten sam wynik w formie obracającej się tarczy.
Import listy z pliku TXT i CSV
Z długimi listami wygodniej pracować przez plik niż przez schowek. Plik przeciągnięty na pole tekstowe jest czytany wyłącznie w przeglądarce i nigdzie go nie wysyłamy. Z pliku TXT bierzemy każdy niepusty wiersz, więc wystarczy, że każde imię stoi w osobnej linii. W pliku CSV czytamy pierwszą kolumnę, a jako separator rozpoznajemy przecinek albo średnik; tabulator obsługujemy tak samo. Pierwszy wiersz pomijamy, gdy wygląda na nagłówek („imie”, „nazwa”, „name”, „uczestnik”).
Cudzysłowy wokół wartości są zdejmowane, a limit wielkości pliku wynosi 2 MB, czego lista imion w praktyce nie osiąga. Jeśli Twój plik ma bardziej złożoną strukturę, na przykład przecinki wewnątrz pól, bezpieczniej jest skopiować samą kolumnę z arkusza i wprowadzić ją do pola tekstowego.
Czego to narzędzie nie zrobi
Nie wygenerujemy linku z zapisanym wynikiem losowania jako dowodu dla uczestników. Taki link musiałby wskazywać na zapis po stronie serwera, czyli na bazę danych przechowującą cudze imiona wraz ze znacznikiem czasu. Oznaczałoby to przetwarzanie danych osobowych i obowiązek informacyjny, a przy tym i tak nie dawałoby twardego dowodu, bo właścicielem bazy bylibyśmy my.
Jeśli potrzebujesz udokumentowanego losowania, nagraj ekran w trakcie losowania albo przeprowadź je na żywo przy uczestnikach i udostępnij nagranie razem z listą startową. Regulaminy loterii promocyjnych zwykle wymagają protokołu i komisji, więc przy losowaniach o dużej wartości wynik z ekranu bywa co najwyżej materiałem pomocniczym.