Slik trekker du konkurransevinnere rettferdig og viser hvordan
For å trekke en vinner rettferdig må du bruke en generator laget for sikkerhet, gi alle deltakere like stor sjanse, og la andre kontrollere resultatet etterpå. Det meste av urettferdighet i en enkel trekning skyldes enten en svak tilfeldighetskilde eller en liten regnefeil som kalles modulo-skjevhet. Begge kan rettes. En publisert liste over deltakere og en logg av trekningen er det beste beviset på at ingen har valgt vinneren.
TrekningVelg en vinner rettferdigGjør det gratisEkte og pseudotilfeldig
En ekte tilfeldighetskilde henter uforutsigbarheten sin fra en fysisk prosess, for eksempel elektronisk støy. En pseudotilfeldig generator er en formel. Den starter fra et frø, utfører faste steg og lager en følge som ser tilfeldig ut. Følgen er helt bestemt av frøet, så den som kjenner frøet og formelen kan forutsi hvert tall.
De fleste programmer bruker pseudotilfeldige generatorer, og det er greit når du blander en spilleliste eller tilfeldiggjør et spillnivå. Ved en trekning der folk har noe å vinne, er spørsmålet om noen kan forutsi eller påvirke resultatet. En generator som er rask, men forutsigbar, er feil verktøy.
Bruk nettleserens kryptografiske generator
I JavaScript er Math.random() en rask pseudotilfeldig generator. Dokumentasjonen sier at den ikke er egnet til kryptografi, og en premietrekning er et sikkerhetsfølsomt valg. Web Crypto-funksjonen crypto.getRandomValues() fyller en matrise med verdier fra operativsystemets kryptografiske tilfeldighetskilde. Det er den du bør bruke. Tilfeldig trekning bruker den ved hvert valg, også ved myntkast og terning. Et verktøy som ikke sier hva det bruker, er vanskeligere å stole på, så spør før du bruker det.
Modulo-skjevhet, med ett eksempel
Anta at kilden din gir en tilfeldig byte, et heltall fra 0 til 255, og at du vil velge ett av tre deltakere. Den enkle løsningen er å ta resten ved divisjon med 3. Det ser rettferdig ut, men 256 kan ikke deles jevnt i grupper på tre.
- Verdiene 0, 3, 6 og så videre opp til 255 gir rest 0. Det er 86 av dem.
- Verdier som gir rest 1 er 85, og verdier som gir rest 2 er også 85.
Deltakeren med verdi 0 kommer derfor opp 86 ganger av 256, omtrent 33,6 %, mens deltakerne 1 og 2 kommer opp 85 ganger hver, omtrent 33,2 %. Forskjellen er liten, men den er reell, og den vokser når antall deltakere blir stort sammenlignet med kildens område.
Løsningen er forkastningssampling. Trekk en verdi, og hvis den havner i den ujevne restdelen, trekk på nytt. I byte-eksempelet forkaster du 255 og godtar bare 0 til 254, som deles jevnt på tre. Med et 32-bits tilfeldig tall er restdelen omtrent én verdi av 4,3 milliarder, så skjevheten er ubetydelig for en konkurranse. En nøye generator håndterer den likevel, fordi den samme feilen blir verre jo mindre området er.
Trekninger uten gjentakelser
Hvis du trenger flere vinnere, kan det hende at du trekker samme deltaker to ganger når du trekker en tilfeldig indeks tre ganger. To rene metoder unngår det:
- Fjern hver vinner fra listen, og trekk deretter på nytt fra resten.
- Stokk hele listen én gang med Fisher–Yates-metoden, og ta vinnerne fra toppen.
Fisher–Yates går gjennom listen bakfra, bytter hver posisjon med en tilfeldig valgt posisjon på eller før den, og gir alle rekkefølger lik sannsynlighet når de tilfeldige valgene er rettferdige. Metoden er kort, godt forstått og lett å forklare for deltakerne. Alternativene «Fjern vinnere» og «Ingen gjentakelser» i verktøyet dekker begge metodene.
Gjør trekningen mulig å kontrollere
En rettferdig trekning er en andre kan kontrollere. Før trekningen bør du:
- Publisere deltakerne som en nummerert liste, sammen med reglene for hvem som kan delta.
- Publisere et SHA-256-fingeravtrykk av listen. Alle verktøy for SHA-256 kan lage et, for eksempel hashgeneratoren. Et fingeravtrykk endrer seg fullstendig om én eneste deltaker endres, så listen kan ikke redigeres i stillhet i etterkant. Den samme kontrollen brukes til å bekrefte nedlastinger; slik sjekker du SHA-256-sjekksummen til en nedlasting viser stegene.
Under og etter trekningen bør du:
- Ta opp skjermen fra du starter verktøyet til resultatet vises.
- Publisere den endelige listen med vinnernummeret, slik at andre kan regne ut fingeravtrykket på nytt og bekrefte at ingenting er endret.
- Si hvordan vinneren ble valgt, for eksempel «valgt med et nettleserbasert trekkverktøy som bruker operativsystemets kryptografiske tilfeldighetskilde».
Konkurransereglene varierer mellom plattformer, og premietrekninger kan ha juridiske krav som avhenger av hvor du bor. Sjekk plattformens regler for kampanjer og lokal lov før du gjennomfører en trekning. Dette er generell veiledning, ikke juridisk rådgivning. Når du er klar, trekker du en vinner med tilfeldig trekning.
Slik gjør du det med fixmint
- Velg Navn, og lim deretter deltakerne inn i Navn, ett per linje.
- Sett Vinnere til antall premier. Kryss av for Fjern vinnere fra listen, slik at ingen kan vinne to ganger.
- For en nummerert trekning velger du Nummer, setter Minst og Størst, og krysser av for Ingen gjentakelser hvis hvert nummer bare kan vinne én gang.
- Trykk Velg vinnere, med skjermopptaket allerede i gang fra starten.
- Publiser de nummererte deltakerne, SHA-256-fingeravtrykket, den vinnende deltakeren og hvordan trekkverktøyet ble brukt.
Raske svar
Er Math.random() greit til en konkurranse?
Det er greit til spill og blanding, men ikke til en trekning som folk skal kunne kontrollere, fordi resultatet kan forutsis. Bruk en kryptografisk kilde.
Hvorfor ikke bare ta et tilfeldig tall modulo antall deltakere?
Når området ikke deles jevnt, blir restene ujevne, og noen deltakere har litt større sjanse. Forkastningssampling fjerner skjevheten.
Kan jeg trekke flere vinnere fra én trekning?
Ja. Fjern hver vinner før neste trekning, eller stokk én gang og ta de øverste. Uansett måte kan ingen deltaker vinne to ganger.
Oversatt fra Engelsk original med KI-hjelp.
Kommentarer
Ingen kommentarer ennå. Bli den første.


