Trenger du å trekke en vinner i en konkurranse, velge hvilken elev som skal svare, eller avgjøre hvem som tar oppvasken? Denne gratis, nettbaserte tilfeldige velgeren trekker rettferdig fra hvilken som helst liste du limer inn. Legg inn oppføringene dine i feltet «Elementer» — én per linje, eller separert med komma — still inn hvor mange du vil ha med «Antall», og trykk på «Generer». En liste krever minst to oppføringer og rommer opptil 1000, der hver kan være opptil 200 tegn lang.
Hvert valg skjer direkte i nettleseren din ved hjelp av Web Crypto API (crypto.getRandomValues), som gir kryptografisk sikre tilfeldige verdier fra operativsystemets underliggende prosesser for tilfeldighet. Listen din blir aldri sendt til en server, aldri loggført, og aldri sett av oss — og det er viktigere her enn på de fleste andre velgere, fordi det folk limer inn som oftest er en kundeliste, klasseliste eller en oversikt over kolleger. Knappen «Last fra fil» opprettholder samme løfte: nettleseren leser filen og fyller feltet lokalt, uten at noe lastes opp.
Alternativene er laget for de listene folk faktisk har. «Skilletegn» står på «Automatisk», som selv skiller mellom linjeskift og komma, slik at en liste kopiert fra et regneark, en chat eller et dokument fungerer uten at du må formatere den på nytt. Lås den til «Linjeskift», «Komma» eller «Mellomrom» hvis dataene dine blander formater — og merk at «Mellomrom» alltid er et bevisst valg og aldri automatisk, ettersom oppføringer som fulle navn inneholder mellomrom, og hvis man automatisk delte dem opp, ville det ødelagt flere lister enn det fikset. «Antall» bestemmer hvor mange oppføringer som skal trekkes, fra 1 til 100. Skal du trekke tre vinnere blant 200 deltakere? Lim inn deltakerne, sett «Antall» til 3, og trykk på «Generer». To innstillinger gjelder kun når antallet er 2 eller mer, og er grået ut inntil da: «Ingen duplikater», som avgjør om den samme oppføringen kan trekkes to ganger, og «Utdataformat», som bestemmer hvordan de valgte elementene separeres — «Hver på en ny linje», «Mellomromseparert» eller «Kommaseparert».
En rekke knapper inne i feltet «Elementer» lar deg gjøre endringer du ellers måtte gjort et annet sted. «Last fra fil» henter en liste direkte fra en ren tekstfil eller CSV-fil. «Bland» endrer rekkefølgen på oppføringene i feltet, «Sorter» ordner dem alfabetisk med tall i naturlig rekkefølge (et nytt klikk snur rekkefølgen), og «Tøm» fjerner alt i feltet. Knappen «Fyll med eksempeldata» legger inn en kort eksempelliste slik at du kan teste velgeren med ett klikk, mens «Utvid for å passe innhold» drar ut feltet for å vise en lang liste i sin helhet, og «Skjul til standardstørrelse» folder det tilbake. Under resultatet kopierer «Kopier alt» alle valgte elementer til utklippstavlen din, «Lagre til fil» lagrer dem til datamaskinen, og «Historikk» beholder de siste 10 trekningene i nettleseren din, slik at et tidligere resultat bare er ett klikk unna.
Hvordan gjøres egentlig trekningen? Når du trykker på «Generer», ber siden nettleseren om tilfeldige verdier via crypto.getRandomValues og bruker disse for å velge posisjoner i listen din, i stedet for å gå gjennom en pseudo-tilfeldig JavaScript-funksjon som Math.random(). Å gjøre en rå 32-bits verdi om til en posisjon er der mange velgere i stillhet gjør feil: å ta verdien modulo lengden på listen er den opplagte metoden, og også den som skaper skjevhet, for med mindre listelengden går nøyaktig opp i 2^32, vil oppføringer nær starten av listen dukke opp litt oftere enn de andre. Den svakheten kalles modulo-skjevhet (modulo bias), og den er målbar fremfor teoretisk. Denne velgeren kaster i stedet enhver verdi som overstiger det høyeste eksakte multiplumet av listelengden, og trekker på nytt — en teknikk kalt forkastelsessampling (rejection sampling). Det koster noen få ekstra trekk, men gir deg en nøyaktig garanti i stedet for en tilnærming. Posisjon i listen endrer ingenting: den første og den siste oppføringen har nøyaktig samme sannsynlighet i hver eneste trekning.
«Ingen duplikater» skiller mellom to genuint forskjellige typer trekninger, og statistikkfaget har et navn for begge. Når den er på, blander velgeren en kopi av listen din med Fisher-Yates-algoritmen og plukker oppføringene fra toppen — det samme som å trekke lapper fra en hatt uten å legge dem tilbake, slik at ingen blir valgt to ganger og enhver gruppe av den størrelsen er like sannsynlig. Det kalles trekning uten tilbakelegging (sampling without replacement), og det er det du ønsker for vinnere, lag og tur-rekkefølge. Når den er av, gjøres hvert valg uavhengig av hele listen, slik at den samme oppføringen kan trekkes mer enn én gang — trekning med tilbakelegging (sampling with replacement), som er det du vil ha når alle forblir valgbare i hver runde, som ved gjentatte loddtrekninger eller statistiske stikkprøver. Ingen av metodene er mer rettferdig enn den andre; de besvarer bare ulike spørsmål.
En rettferdig trekning skal ikke se rettferdig ut. Trekk fem navn av ti, og du vil jevnlig se to valg som sto ved siden av hverandre i den opprinnelige listen, eller det samme navnet to ganger på rad når duplikater er tillatt, og alt dette er helt ordinært. Hver trekning er uavhengig: tidligere valg har ingen som helst påvirkning på de senere, og ingen har noensinne en seier «til gode». Instinktet som påstår det motsatte er gamblerens feilslutning (gambler's fallacy), og det er det samme instinktet som gjør oss dårlige til å velge tilfeldig på egen hånd — blir vi bedt om å velge tilfeldig, unngår vi den første og den siste oppføringen, vi unngår å repetere et navn, og vi sprer valgene våre langt jevnere enn det tilfeldigheten noen gang gjør. Et resultat som ser mistenkelig ryddig ut, er fingeravtrykket til et menneske; ekte tilfeldighet skaper klumper.
Hvorfor velge denne tilfeldige velgeren?
- Kun i nettleser: listen din leses på enheten din og sendes aldri noe sted
- Web Crypto API-tilfeldighet: kryptografisk sikker, ikke Math.random()
- Ingen modulo-skjevhet: forkastelsessampling holder hver oppføring like sannsynlig
- Hvilket som helst listeformat: én per linje, med komma, eller med mellomrom, uten omformatering
- «Ingen duplikater»-modus: trekk vinnere eller lag uten at noen velges to ganger
- Opptil 1000 oppføringer, og opptil 100 valg i en enkelt trekning
- Innebygde listeverktøy: last fra fil, bland, sorter, tøm, eksempeldata
- Historikk og Lagre til fil: behold et register over en trekning du kanskje må forsvare
- Ubegrenset og gratis: ingen registrering, ingen bruksgrenser, ingenting på våre servere
Tilfeldig trekning dukker opp overalt hvor et valg må tåle å bli stilt spørsmål ved. Lærere i Norge velger ut elever uten favorisering og deler en klasse inn i prosjektgrupper. Streamere og markedsførere trekker vinnere av giveaways foran et publikum som må tro på resultatet. Ledere deler ut oppgavene ingen melder seg frivillig til, og team bestemmer rekkefølgen på presentasjoner eller hvem som har bakvakt. Forskere trekker et tilfeldig utvalg av poster for gjennomgang. Familier gjør slutt på diskusjonen om hva man skal se på, og en sulten gjeng velger restaurant. Fellesnevneren er et valg som hvem som helst kan forklare i etterkant: trekningen bruker kryptografisk tilfeldighet, den skjer i sin helhet på enheten din, og «Historikk» beholder resultatet hvis noen spør om det senere.
Denne velgeren har noen få ærlige begrensninger som er verdt å vite om. Den kan ikke trekke flere unike oppføringer enn det listen din inneholder — tre vinnere krever minst tre navn — og den stopper ved 1000 oppføringer på 200 tegn hver, med opptil 100 valg i én trekning. «Bland» og «Sorter» fungerer linje for linje, så en kommaseparert liste som er limt inn på én linje, blir først omorganisert når den er delt opp til én oppføring per linje; og begge disse knappene endrer rekkefølgen i feltet, men ikke i selve trekningen, som er like rettferdig uansett hvilken rekkefølge oppføringene dine står i. Hver oppføring har også nøyaktig samme vekt, så i en trekning der ett navn skal telle dobbelt, må det navnet føres opp to ganger. Innenfor disse grensene er garantien sterk — hver eneste oppføring i listen din har nøyaktig samme sjanse, i hver eneste trekning.