Mikä tämä työkalu on?
Listan satunnaistaja järjestää joukon kohteita satunnaiseen järjestykseen tai poimii siitä satunnaisen osajoukon. Vaikea osuus on tehdä tämä ilman vinoumaa: naiivi lähestymistapa, kuten taulukon lajittelu satunnaisella vertailufunktiolla, tuottaa vinoutuneen jakauman, jossa jotkin järjestykset ovat paljon todennäköisempiä kuin toiset.
Tämä työkalu käyttää Fisher–Yates (Durstenfeld) -sekoitusalgoritmia, standardimenetelmää todistetusti tasajakautuneen satunnaispermutaation tuottamiseen — jokainen mahdollinen listasi järjestys on yhtä todennäköinen.
Miksi käyttää sitä?
- Aidosti puolueeton sekoitus — Fisher–Yates, ei yleistä sort(() => Math.random() - 0.5) -antikuviota, joka vinouttaa tuloksia.
- Voittaja-arvontatila: arvo tasan N satunnaista kohdetta koko listan sekoittamisen sijaan, ihanteellinen arpajaisiin ja kilpailuihin.
- Valinnainen duplikaattien poisto ennen sekoitusta listoille, joissa saattaa olla vahingossa toistuvia merkintöjä.
- Toimii minkä tahansa tekstin kanssa — nimet, tehtävät, liput, palkinnot — yksi rivi kerrallaan.
- Yksityinen: sekoitus tapahtuu kokonaan selaimessasi, mitään ei ladata.
Käyttöohje
- Liitä listasi laatikkoon, yksi rivi kerrallaan.
- Valitse tarvittaessa "remove duplicates before shuffling", jos listassa saattaa olla toistoja.
- Täyttä uudelleenjärjestystä varten klikkaa vain Shuffle. Voittajien valintaan valitse N-kohteen vaihtoehto ja aseta arvottavien määrä.
- Kopioi tulos — klikkaa Shuffle uudelleen milloin tahansa saadaksesi uuden satunnaisjärjestyksen tai arvonnan.
Esimerkki
Syöte
Alice
Bob
Charlie
Diana
EthanTuloste
Satunnaisesti uudelleenjärjestetty lista kuten Charlie, Ethan, Alice, Diana, Bob — eri joka kerta kun klikkaat Shuffle.Voittaja-arvontatilassa arvoon 2 asetettuna sama syöte saattaisi sen sijaan tuottaa vain Ethanin ja Alicen — satunnaisen 2 kohteen arvonnan, ei 2 kohteen viipaleen yhdestä sekoitetusta järjestyksestä.
Miksi naiivi sekoitus tuottaa vinoutuneita tuloksia
sort(() => Math.random() - 0.5) on yleinen temppu, joka vaikuttaa oikealta muttei ole: se luottaa siihen, että lajittelualgoritmi kutsuu vertailufunktiota tietyn määrän kertoja tietyssä kuviossa, eivätkä todelliset lajittelutoteutukset takaa tätä. Käytännön vaikutus on sekoitus, jossa tietyt järjestykset esiintyvät useammin kuin toiset — riittävän hienovaraisesti, jotta se läpäisee satunnaisen silmäyksen, mutta tilastollisesti mitattavissa monien ajokertojen aikana.
Fisher–Yates ohittaa koko ongelman: sen sijaan, että pyytäisi lajittelualgoritmia tuottamaan satunnaisuutta epäsuorasti, se vaihtaa suoraan jokaisen paikan satunnaisen jäljellä olevan paikan kanssa täsmälleen kerran, mikä on todistetusti tasajakautunut riippumatta taustalla olevan kielen lajittelutoteutuksesta.
Usein kysytyt kysymykset
Miksi ei vain käytetä array.sort(() => Math.random() - 0.5)?
Tuo yhden rivin temppu on tunnettu antikuvio: JavaScriptin sort() ei takaa, että jokaista alkioparia verrataan saman verran kertoja, joten tuloksena oleva järjestys on mitattavasti vinoutunut tiettyihin permutaatioihin — jotkin kohteet päätyvät todennäköisemmin alkuun tai loppuun kuin aito satunnaisuus tuottaisi. Fisher–Yates välttää tämän kokonaan rakenteensa ansiosta, ja se on algoritmi, jonka tämä työkalu todella toteuttaa.
Onko sekoitusjärjestys todella puolueeton?
Kyllä. Fisher–Yates käy listan läpi kerran, ja jokaisessa vaiheessa vaihtaa nykyisen kohteen tasaisen satunnaisesti valitun kohteen kanssa jäljellä olevasta sekoittamattomasta osasta. Tämän on matemaattisesti todistettu tuottavan jokainen mahdollinen järjestys yhtä todennäköisesti, kun satunnaisuuden lähde on hyvä (JavaScriptin Math.random()).
Mikä on ero sekoituksen ja voittaja-arvontatilan välillä?
Sekoitustila järjestää jokaisen listasi kohteen uudelleen ja näyttää ne kaikki, vain uudessa järjestyksessä. Voittaja-arvontatila arpoo vain N kohdetta satunnaisesti ja näyttää vain ne — hyödyllinen, kun haluat valita kiinteän määrän voittajia tai näytteitä paljastamatta koko uudelleenjärjestettyä listaa.
Voinko käyttää tätä oikeaan palkintoarvontaan tai arpajaisiin?
Kyllä, epävirallisiin arvontoihin ja kilpailuihin tämä toimii hyvin, koska satunnaisuus on aidosti tasajakautunutta. Lakisääteisesti säänneltyihin, rahapalkintoisiin arpajaisiin tarkista paikalliset säädöksesi — jotkin lainkäyttöalueet vaativat tietyn todennettavan arvontaprosessin.
Muuttaako duplikaattien poisto alkuperäistä listaani?
Ei — deduplikointi vaikuttaa vain sekoitettuun tulosteeseen, ja vain kun valintaruutu on käytössä. Syöttölistasi pysyy täsmälleen sellaisena kuin kirjoitit sen, joten voit vaihtaa asetusta ja sekoittaa uudelleen kirjoittamatta mitään uudestaan.