CodeKitHub
Polski
Narzędzia generujące

Darmowy program do losowego porządkowania list

Wklej listę — nazwiska, zadania, zgłoszenia do loterii, cokolwiek — po jednej pozycji w każdym wierszu, a następnie przetasuj ją w sprawiedliwy, losowy porządek przy użyciu algorytmu Fishera-Yatesa. Włącz tryb losowania zwycięzcy, aby wylosować tylko N losowych pozycji. Jest to przydatne do wyłonienia zwycięzcy konkursu z nagrodami lub przypisania losowej kolejności bez ujawniania całej przetasowanej listy.

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ć

  1. Wklej swoją listę do pola, po jednej pozycji w każdym wierszu.
  2. Jeśli lista może zawierać powtórzenia, można zaznaczyć opcję „usuń duplikaty przed losowaniem”.
  3. 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.
  4. 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
Ethan

Wynik

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.

Generator liczb losowych · Generator UUID

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.

Powiązane narzędzia