Välj tävlingsvinnare rättvist och visa hur du gjorde
För att välja en vinnare rättvist använder du en generator byggd för säkerhet, ger varje post samma chans och låter folk kontrollera resultatet i efterhand. De flesta orättvisor i en enkel slumpväljare kommer från ett av två håll: en svag slumpkälla eller ett litet aritmetiskt fel som kallas modulo-bias. Båda går att åtgärda. En publicerad lista över deltagarna och en logg över dragningen är det bästa beviset på att ingen valde vinnaren.
SlumpväljareVälj en vinnare rättvistGör det gratisSann och pseudoslumpmässig
En sann slumpkälla får sin oförutsägbarhet från en fysisk process, till exempel elektroniskt brus. En pseudoslumpgenerator är en formel. Den startar från ett frö, utför deterministiska steg och ger en följd som ser slumpmässig ut. Följden är helt bestämd av fröet, så den som känner till fröet och formeln kan förutsäga varje tal.
De flesta program använder pseudoslumpgeneratorer, och det duger för att blanda en spellista eller slumpa fram en spelnivå. Vid en lottning där folk har något att vinna är frågan om någon kan förutsäga eller påverka resultatet. En generator som är snabb men förutsägbar är fel verktyg.
Använd webbläsarens kryptografiska generator
I JavaScript är Math.random() en snabb pseudoslumpgenerator. Dess dokumentation säger att den inte är lämplig för kryptografi, och en prisdragning är ett säkerhetskänsligt val. Web Crypto-funktionen crypto.getRandomValues() fyller en matris med värden från operativsystemets kryptografiska slumpkälla. Det är den du ska använda. Slumpväljaren använder den för varje val, även myntkast och tärningar. En väljare som inte säger vad den använder är svårare att lita på, så fråga innan du förlitar dig på den.
Modulo-bias, med ett exempel
Anta att din källa ger en slumpmässig byte, ett heltal från 0 till 255, och att du vill ha en av tre poster. Den enkla vägen är att ta resten när du delar med 3. Det ser rättvist ut, men 256 delar inte jämnt i grupper om tre.
- Värdena 0, 3, 6 och så vidare upp till 255 ger rest 0. Det finns 86 av dem.
- Värden som ger rest 1 är 85 till antalet, och värden som ger rest 2 är också 85.
Post 0 kommer alltså upp 86 gånger av 256, ungefär 33,6 %, medan post 1 och 2 kommer upp 85 gånger vardera, ungefär 33,2 %. Skillnaden är liten, men den är verklig, och den växer när antalet poster blir stort jämfört med källans omfång.
Lösningen är förkastningssampling. Dra ett värde, och om det hamnar i den ojämna resten drar du igen. I bytexemplet förkastar du 255 och accepterar bara 0 till 254, som delar jämnt med tre. Med ett 32-bitars slumptal är resten ungefär ett värde på 4,3 miljarder, så biasen är försumbar för en tävling. En noggrann väljare hanterar den ändå, eftersom samma miss blir värre när omfånget krymper.
Dragningar utan upprepning
Om du behöver flera vinnare kan du få samma post två gånger om du drar ett slumpmässigt index tre gånger. Två rena metoder undviker det:
- Ta bort varje vinnare från listan och dra sedan på nytt bland resten.
- Blanda hela listan en gång med Fisher–Yates-metoden och ta sedan vinnarna från toppen.
Fisher–Yates går igenom listan bakifrån, byter plats på varje position med en slumpvald position vid eller före den, och ger varje ordning lika stor sannolikhet när de slumpmässiga valen är rättvisa. Den är kort, väl känd och lätt att förklara för deltagarna. Väljarens alternativ Ta bort vinnare och Inga upprepningar hanterar båda metoderna.
Gör dragningen kontrollerbar
En rättvis dragning är en som vem som helst kan kontrollera. Innan dragningen:
- Publicera posterna som en numrerad lista, tillsammans med reglerna för vem som var berättigad.
- Publicera ett SHA-256-fingeravtryck av listan. Vilket SHA-256-verktyg som helst kan skapa ett, till exempel hashgeneratorn. Ett fingeravtryck ändras helt om en enda post ändras, så listan kan inte redigeras i smyg i efterhand. Samma kontroll används för nedladdningar; så kontrollerar du en nedladdnings SHA-256-checksumma visar stegen.
Under och efter dragningen:
- Spela in skärmen från det att du startar väljaren till det visade resultatet.
- Publicera den slutliga listan med det vinnande numret, så att folk kan räkna om fingeravtrycket och bekräfta att inget har ändrats.
- Berätta hur vinnaren valdes, till exempel „vald med en webbläsarbaserad väljare som använder operativsystemets kryptografiska slumpkälla”.
Tävlingsregler skiljer sig mellan plattformar, och prisdragningar kan ha juridiska krav som beror på var du bor. Kontrollera plattformens promotionregler och din lokala lagstiftning innan du genomför en. Detta är allmän vägledning, inte juridisk rådgivning. När du är redo, välj en vinnare med slumpväljaren.
Så gör du med fixmint
- Välj Namn och klistra sedan in posterna i Namn, ett per rad.
- Ställ in Vinnare på antalet priser. Markera Ta bort vinnare från listan så att ingen kan vinna två gånger.
- För en numrerad dragning väljer du Nummer, ställer in Minst och Störst, och markerar Inga upprepningar om varje nummer bara får vinna en gång.
- Tryck på Välj vinnare med skärminspelningen redan igång från start.
- Publicera de numrerade posterna, SHA-256-fingeravtrycket, den vinnande posten och hur väljaren användes.
Snabba svar
Är Math.random() bra nog för en tävling?
Den duger för spel och blandning, men inte för en dragning som folk ska kunna kontrollera, eftersom resultatet kan förutsägas. Använd en kryptografisk källa.
Varför inte bara ta ett slumptal modulo antalet poster?
När intervallet inte delar jämnt blir resten ojämn, så vissa poster är lite mer sannolika. Förkastningssampling tar bort biasen.
Kan jag välja flera vinnare från samma dragning?
Ja. Ta bort varje vinnare innan nästa val, eller blanda en gång och ta de översta posterna. Oavsett vilket kan ingen post vinna två gånger.
Översatt från Engelsk original med hjälp av AI.
Kommentarer
Inga kommentarer än. Var först.


