Pitääkö sinun arpoa kilpailun voittaja, valita oppilas vastaamaan tai päättää kuka tiskaa? Tämä ilmainen verkossa toimiva satunnaisvalitsija valitsee reilusti mistä tahansa liittämästäsi listasta. Laita alkiosi ”Elementit”-kenttään — yksi per rivi tai pilkuilla eroteltuna —, aseta haluamasi lukumäärä ”Määrä”-kenttään ja paina ”Generoi”. Lista vaatii vähintään kaksi alkiota ja siihen mahtuu jopa 1000 alkiota, joista jokainen voi olla enintään 200 merkkiä pitkä.
Jokainen valinta tehdään suoraan selaimessasi käyttämällä Web Crypto API:a (crypto.getRandomValues), joka tarjoaa kryptografisesti vahvoja satunnaisarvoja laitteesi käyttöjärjestelmästä. Listaasi ei koskaan lähetetä palvelimelle, sitä ei tallenneta, emmekä me koskaan näe sitä — tämä on täällä tärkeämpää kuin useimmissa generaattoreissa, sillä ihmisten liittämät tiedot ovat yleensä asiakaslistoja, luetteloita luokan oppilaista tai työkavereiden nimiä. ”Lataa tiedostosta” pitää saman lupauksen: selaimesi lukee tiedoston ja täyttää kentän paikallisesti ilman, että mitään lähetetään minnekään.
Asetukset on tehty vastaamaan sellaisia listoja, joita ihmisillä oikeasti on. ”Erotin” on oletuksena asennossa ”Automaattinen”, joka tunnistaa rivinvaihdot ja pilkut ja päättelee kumpi on kyseessä, joten taulukkolaskentaohjelmasta, viestistä tai asiakirjasta kopioitu lista toimii suoraan ilman uudelleenmuotoilua. Lukitse asetus arvoon ”Rivinvaihto”, ”Pilkku” tai ”Välilyönti” vain silloin, kun datasi sekoittaa eri muotoja — ja huomaa, että ”Välilyönti” on aina tietoinen valinta eikä koskaan automaattinen, sillä esimerkiksi koko nimissä on itsessään välilyöntejä, ja niiden jakaminen oletuksena rikkoisi useampia listoja kuin se korjaisi. ”Määrä” määrittää, kuinka monta alkiota arvotaan, väliltä 1–100. Arvotko kolme palkinnonsaajaa 200 osallistujan joukosta? Liitä osallistujat, aseta ”Määrä” arvoon 3 ja paina ”Generoi”. Kaksi valitsinta tulee käyttöön vasta kun määrä on vähintään 2, ja ne pysyvät harmaina siihen asti: ”Ilman kaksoiskappaleita”, joka päättää voiko saman alkion arpoa kahdesti, sekä ”Tulostusmuoto”, joka asettaa miten valinnat erotellaan toisistaan — ”Yksi per rivi”, ”Välilyönnillä eroteltu” tai ”Pilkulla eroteltu”.
Rivissä olevat painikkeet ”Elementit”-kentän sisällä tekevät muokkaukset, jotka muuten pitäisi tehdä muualla. ”Lataa tiedostosta” vetää listan suoraan teksti- tai CSV-tiedostosta. ”Sekoita” muuttaa kentän alkioiden järjestystä satunnaiseksi, ”Lajittele” järjestää ne aakkosjärjestykseen niin, että numerot järjestyvät luonnollisesti (toinen napsautus kääntää järjestyksen), ja ”Tyhjennä” tyhjentää koko kentän. ”Täytä esimerkkitiedoilla” pudottaa lyhyen esimerkkilistan, jotta voit kokeilla valitsijaa yhdellä napsautuksella, kun taas ”Laajenna sisältöön sopivaksi” avaa kentän näyttämään pitkän listan kokonaan ja ”Kutista oletuskokoon” taittaa sen takaisin. Tuloksen alla ”Kopioi kaikki” vie jokaisen valinnan leikepöydälle, ”Tallenna tiedostoon” kirjoittaa ne levylle, ja ”Historia” pitää selaimesi muistissa 10 viimeisintä arvontaasi, joten aiempi tulos on aina yhden napsautuksen päässä.
Miten valinta itse asiassa tapahtuu? Kun painat ”Generoi”, sivu pyytää selaimelta satunnaisarvoja crypto.getRandomValues -rajapinnan kautta ja käyttää niitä valitsemaan sijainteja listaltasi, sen sijaan että se luottaisi JavaScriptin Math.random() -funktion kaltaisiin pseudosatunnaisiin toimintoihin. Raakan 32-bittisen arvon muuttaminen sijainniksi on se vaihe, jossa arvontakoneet usein menevät hiljaisesti pieleen: arvon jakojäännöksen (modulo) ottaminen listan pituudella on ilmeisin lähestymistapa, mutta samalla vääristynyt sellainen, sillä ellei listan pituus jaa lukua 2^32 tasan, listan alkupäässä olevat alkiot tulevat valituiksi hieman useammin kuin muut. Tätä virhettä kutsutaan modulo-vääristymäksi (modulo bias), ja se on pikemminkin mitattavissa oleva kuin pelkkä teoreettinen ongelma. Tämä valitsija sen sijaan hylkää kaikki arvot, jotka ylittävät suurimman mahdollisen listan pituuden tarkan kerrannaisen, ja arpoo uudelleen — tekniikkaa kutsutaan hylkäysotannaksi (rejection sampling). Se maksaa muutaman ylimääräisen arvonnan, mutta ostaa niillä tarkan takuun likimääräisen sijaan. Sijoittuminen listalla ei muuta mitään: ensimmäisellä ja viimeisellä alkiolla on täsmälleen sama todennäköisyys jokaisessa arvonnassa.
Asetus ”Ilman kaksoiskappaleita” erottaa toisistaan kaksi aidosti erilaista arvontatyyppiä, ja tilastotieteellä on molemmille oma nimensä. Kun asetus on päällä, valitsija sekoittaa kopion listastasi Fisher-Yates-algoritmilla ja poimii alkiot aivan huipulta — aivan kuten vetäisi arpoja hatusta laittamatta niitä takaisin, jolloin ketään ei valita kahdesti ja jokainen sen kokoinen ryhmä on yhtä todennäköinen. Tämä on otantaa ilman takaisinpanoa (sampling without replacement), ja juuri tätä tarvitset palkinnonsaajiin, joukkueisiin ja vuorojen järjestykseen. Kun se on pois päältä, jokainen valinta tehdään itsenäisesti koko listasta, joten sama alkio voi tulla esiin useammin kuin kerran — tämä on otantaa takaisinpanolla (sampling with replacement), jota haluat silloin, kun kaikki pysyvät mukana jokaisella kierroksella, kuten toistuvissa arvonnoissa tai nopeassa tilastollisessa otoksessa. Kumpikaan tila ei ole toista reilumpi; ne vastaavat vain eri tarpeisiin.
Reilun arvonnan ei kuulu näyttää reilulta. Arvo kymmenestä nimestä viisi, ja tulet säännöllisesti näkemään kaksi valintaa, jotka sijaitsivat vierekkäin alkuperäisellä listalla, tai saman nimen kahdesti peräkkäin kunhan kaksoiskappaleet on sallittu — jokainen näistä tapauksista on täysin arkinen. Jokainen arvonta on itsenäinen: aiemmilla valinnoilla ei ole minkäänlaista vaikutusta myöhempiin, eikä kenenkään kohdalla voitto ole koskaan ”velkaa” aiempien tappioiden vuoksi. Vaisto, joka väittää itsepintaisesti toista, on pelurin harha (gambler's fallacy), ja se on sama vaisto, joka tekee meistä itsestämme huonoja valitsemaan satunnaisesti. Jos meitä pyydetään valitsemaan sattumanvaraisesti, vältämme listan alkua ja loppua, vältämme toistamasta samaa nimeä ja levitämme valintamme paljon tasaisemmin kuin todellinen sattuma koskaan tekee. Epäilyttävän siistiltä näyttävä tulos on ihmisen sormenjälki; aito satunnaisuus tuottaa rykelmiä.
Miksi käyttää tätä satunnaisvalitsijaa?
- Arvonta vain selaimessa: listasi luetaan laitteellasi eikä sitä koskaan lähetetä mihinkään
- Web Crypto API -satunnaisuus: kryptografisesti turvallinen, ei pelkkä Math.random()
- Ei modulo-vääristymää: hylkäysotanta pitää jokaisen alkion valinnan yhtä todennäköisenä
- Mikä tahansa listan muoto: yksi per rivi, pilkuilla tai välilyönneillä ilman uudelleenmuotoilua
- ”Ilman kaksoiskappaleita” -tila: arvo voittajat tai joukkueet niin, ettei ketään valita kahdesti
- Jopa 1000 alkiota ja kerralla enintään 100 valintaa samassa arvonnassa
- Sisäänrakennetut listatyökalut: lataa tiedostosta, sekoita, lajittele, tyhjennä, esimerkkitiedot
- Historia ja Tallenna tiedostoon: pidä kirjaa arvonnasta, jota saatat joutua myöhemmin perustelemaan
- Rajoittamaton ja ilmainen: ei rekisteröitymistä, ei käyttörajoituksia, ei mitään tallessa palvelimillamme
Satunnaista valitsemista tarvitaan kaikkialla, missä tehdyn päätöksen täytyy kestää kyseenalaistamista. Suomalaiset opettajat kutsuvat oppilaita vastaamaan suosimatta ketään ja jakavat luokan projektiryhmiin. Striimaajat ja markkinoijat arpovat kilpailujen ja arpajaisten voittajia yleisön edessä, jonka on voitava luottaa tulokseen. Esihenkilöt jakavat ne tehtävät joihin kukaan ei vapaaehtoisesti ilmoittaudu, ja tiimit päättävät demojen esitysjärjestyksestä tai siitä kuka on päivystysvuorossa. Tutkijat poimivat tietueista satunnaisotoksen tarkastettavaksi. Perheet lopettavat riidan siitä mitä katsotaan, ja nälkäinen kaveriporukka valitsee mihin mennään syömään. Yhdistävä tekijä on valinta, jonka kuka tahansa voi selittää jälkikäteen: arvonta käyttää kryptografista satunnaisuutta, se tapahtuu kokonaan omalla laitteellasi, ja ”Historia” pitää tuloksen tallessa jos joku kysyy siitä myöhemmin.
Tällä valitsijalla on muutama reilu rajoitus, jotka on hyvä tietää. Se ei pysty arpomaan useampia uniikkeja alkioita kuin mitä listallasi on — kolme voittajaa vaatii vähintään kolme nimeä — ja se pysähtyy 1000 alkioon, joista kukin voi olla 200 merkkiä pitkä. Yhdessä arvonnassa sallitaan korkeintaan 100 valintaa. Painikkeet ”Sekoita” ja ”Lajittele” toimivat rivi kerrallaan, joten yhdelle riville liitetty pilkuilla eroteltu lista järjestetään vasta, kun se on muutettu yhdeksi alkioksi per rivi. Molemmat näistä muuttavat ainoastaan kentän ulkoasua arvonnan sijaan, joka puolestaan on täysin yhtä reilu riippumatta siitä, missä järjestyksessä alkiosi ovat. Jokainen alkio kantaa tarkalleen saman painoarvon tarkoituksella, joten sellainen arvonta, jossa yhden nimen tulisi laskea tuplana, vaatii kyseisen nimen listaamisen kahdesti. Näiden rajojen puitteissa takuu on vahva — jokaisella listasi alkiolla on täsmälleen sama mahdollisuus tulla valituksi jokaisella yksittäisellä arvontakerralla.