Czym jest to narzędzie?
Program do losowego porządkowania listy zmienia kolejność elementów w zbiorze, układając je w losowej kolejności, lub wybiera z niego losowy podzbiór. Trudność polega na tym, by zrobić to bez stronniczości: proste podejście, takie jak sortowanie tablicy przy użyciu losowej funkcji porównawczej, prowadzi do nierównomiernego rozkładu, w którym niektóre kolejności są znacznie bardziej prawdopodobne niż inne.
Narzędzie to wykorzystuje algorytm losowania Fishera–Yatesa (Durstenfelda), który jest standardową metodą zapewniającą losową permutację o udowodnionej równomierności — każda możliwa kolejność elementów listy ma takie samo prawdopodobieństwo wystąpienia.
Dlaczego warto go używać?
- Prawdziwie losowe tasowanie — algorytm Fishera–Yatesa, a nie powszechnie stosowany antywzorzec (() => Math.random() - 0.5), który zniekształca wyniki.
- Tryb losowania zwycięzców: losuje dokładnie N pozycji zamiast przetasowywać całą listę – idealny do loterii i konkursów z nagrodami.
- Opcjonalne usuwanie duplikatów przed przetasowaniem – w przypadku list, które mogą zawierać przypadkowe powtórzenia.
- Działa z dowolnym tekstem — nazwiskami, zadaniami, zgłoszeniami, nagrodami — po jednej pozycji w każdym wierszu.
- Prywatne: losowanie odbywa się wyłącznie w przeglądarce, żadne dane nie są przesyłane.
Jak używać
- Wklej swoją listę do pola, po jednej pozycji w każdym wierszu.
- Jeśli lista może zawierać powtórzenia, można zaznaczyć opcję „usuń duplikaty przed losowaniem”.
- Aby całkowicie zmienić kolejność, wystarczy kliknąć przycisk „Losuj”. Aby wybrać zwycięzców, zaznacz opcję „N elementów” i ustaw liczbę elementów do wylosowania.
- Skopiuj wynik — w dowolnym momencie kliknij ponownie przycisk „Losuj”, aby uzyskać nową losową kolejność lub przeprowadzić nowe losowanie.
Przykład
Wejście
Alice
Bob
Charlie
Diana
EthanWynik
A randomly reordered list such as Charlie, Ethan, Alice, Diana, Bob — different every time you click Shuffle.Gdy tryb wyboru zwycięzców jest ustawiony na 2, to samo dane wejściowe mogą zamiast tego wygenerować jedynie imiona Ethan i Alice — losowy zestaw dwóch elementów, a nie podzbiór dwóch elementów z jednej przetasowanej kolejności.
Dlaczego naiwne przetasowanie daje wyniki obciążone
sort(() => Math.random() - 0.5) to popularna sztuczka, która wydaje się poprawna, ale tak nie jest: opiera się ona na założeniu, że algorytm sortowania wywołuje komparator określoną liczbę razy według określonego schematu, a rzeczywiste implementacje sortowania tego nie gwarantują. W praktyce skutkuje to przetasowaniem, w którym niektóre kolejności pojawiają się częściej niż inne — jest to na tyle subtelne, że umknie to pobieżnemu spojrzeniu, ale można to zmierzyć statystycznie po wielu przebiegach.
Algorytm Fishera–Yatesa omija ten problem całkowicie: zamiast wymagać od algorytmu sortującego, by pośrednio generował losowość, dokonuje on bezpośrednio zamiany każdej pozycji z losową pozycją spośród pozostałych dokładnie jeden raz, co – jak można udowodnić – jest rozkładem jednolitym niezależnie od implementacji sortowania w danym języku programowania.
Najczęściej zadawane pytania
Dlaczego po prostu nie użyć `array.sort(() => Math.random() - 0.5)`?
Ten jednowierszowy kod stanowi dobrze znany antywzorzec: funkcja sort() w JavaScript nie gwarantuje, że każda para elementów zostanie porównana tyle samo razy, więc wynikowa kolejność jest w wymierny sposób tendencyjna w kierunku pewnych permutacji — niektóre elementy z większym prawdopodobieństwem trafiają na początek lub koniec listy, niż wynikałoby to z prawdziwej losowości. Algorytm Fishera–Yatesa całkowicie tego unika dzięki swojej konstrukcji i właśnie ten algorytm jest faktycznie zaimplementowany w tym narzędziu.
Czy kolejność losowa jest rzeczywiście obiektywna?
Tak. Algorytm Fishera–Yatesa przechodzi raz przez listę i na każdym kroku zamienia bieżący element z elementem wybranym losowo z pozostałej, nieprzetasowanej części listy. Udowodniono matematycznie, że przy dobrym źródle losowości (np. funkcja Math.random() w JavaScript) algorytm ten generuje wszystkie możliwe porządki z równym prawdopodobieństwem.
Jaka jest różnica między trybem losowania a trybem wyboru zwycięzcy?
Tryb losowy zmienia kolejność wszystkich pozycji na liście i wyświetla je wszystkie, ale w nowej kolejności. Tryb wyboru zwycięzców losowo wybiera tylko N pozycji i wyświetla wyłącznie te — przydaje się, gdy chcesz wybrać określoną liczbę zwycięzców lub próbek bez ujawniania całej listy w zmienionej kolejności.
Czy mogę to wykorzystać do prawdziwego losowania nagród lub loterii fantowej?
Tak, w przypadku nieformalnych rozdawania nagród i losowań to rozwiązanie sprawdza się dobrze, ponieważ losowość jest rzeczywiście jednolita. W przypadku loterii podlegających regulacjom prawnym, w których przyznawane są nagrody pieniężne, należy zapoznać się z lokalnymi przepisami — niektóre jurysdykcje wymagają zastosowania konkretnej, podlegającej audytowi procedury losowania.
Czy usunięcie duplikatów wpłynie na moją pierwotną listę?
Nie — deduplikacja dotyczy wyłącznie przetasowanych wyników i ma zastosowanie tylko wtedy, gdy pole wyboru jest zaznaczone. Lista wejściowa pozostaje dokładnie taka, jak ją wpisałeś, więc możesz włączać i wyłączać tę opcję oraz ponownie przetasowywać listę bez konieczności ponownego wpisywania czegokolwiek.