Is uw willekeurige nummergenerator eerlijk? Praktische controlechecklist

Als je een loterij houdt, willekeurig teams kiest of taken toewijst door middel van een loterij, is eerlijkheid niet optioneel; het gaat om het hele punt. Maar ‘willekeurig’ betekent niet automatisch ‘eerlijk’. Verborgen vooroordelen in willekeurige getalgeneratoren (RNG's) kunnen de resultaten vertekenen op manieren die onzichtbaar zijn, tenzij je weet waar je moet kijken.
Dit artikel geeft je een praktische checklist waarmee je elke RNG kunt controleren op eerlijkheid, of je nu onze Random Number Generator gebruikt of je eigen RNG bouwt.
Wat eerlijkheid betekent voor gebruikersgerichte trekkingen
Een eerlijke RNG levert resultaten op waarbij:
- Uniformiteit — elke uitkomst heeft een gelijke waarschijnlijkheid (voor uniforme verdelingen)
- Onafhankelijkheid — elke trekking wordt niet beïnvloed door eerdere trekkingen
- Onvoorspelbaarheid — geen enkele waarnemer kan het volgende resultaat beter voorspellen dan het toeval
- Verifieerbaarheid — deelnemers kunnen bevestigen dat het proces niet is gemanipuleerd
Het missen van een van deze zaken schendt het vertrouwen, ook al lijken de resultaten willekeurig.
Veelvoorkomende bronnen van vooringenomenheid
Slechte zaden
Een PRNG (pseudo-random number generator) is slechts zo onvoorspelbaar als zijn zaad. Veelvoorkomende slechte zaden:
- Huidige tijdstempel — voorspelbaar tot op de milliseconde; een aanvaller die ongeveer weet wanneer de trekking loopt, kan het resultaat reproduceren
- Opeenvolgende tellers — helemaal niet willekeurig
- Gebruikersinvoer — kan worden gemanipuleerd door deelnemers
Altijd afkomstig van een cryptografische bron: crypto.getRandomValues() in browsers, /dev/urandom op Linux, of crypto.randomBytes() in Node.js.
Modulo-bias
Een subtiele en veel voorkomende bug: het gebruik van de modulo-operator om een willekeurig getal terug te brengen tot een bereik.
// BIASED — als het RNG-bereik geen veelvoud van 6 is,
// sommige uitkomsten zijn iets waarschijnlijker
const roll = randomUint32() % 6; // CORRECT — afwijzingsbemonstering
functie eerlijkDiceRoll() { const max = Math.floor(0xFFFFFFFF / 6) * 6; laat waarde; doe { value = crypto.getRandomValues(new Uint32Array(1))[0]; } while (waarde >= max); retourwaarde % 6;
}Voor een 6-zijdige dobbelsteen is de modulo bias met een 32-bits geheel getal slechts ~0,00000009%. Maar voor grotere bereiken of 8-bits waarden wordt het significant.
Verborgen filters
Sommige trekkingssystemen sluiten stilletjes bepaalde resultaten uit (bijvoorbeeld het uitfilteren van "recente winnaars" of het opnieuw gooien van resultaten die de operator niet bevalt). Dit is in strijd met de eerlijkheid, zelfs als de onderliggende RNG perfect is. Documenteer en maak eventuele filterregels bekend vóór de trekking.
Auditchecklist voor operators
- Entropiebron — Is de RNG afkomstig van een cryptografische bron? (Niet Math.random, geen tijdstempels)
- Uniformiteitstest — Voer meer dan 10.000 monsters uit en pas een chikwadraattest toe. p-waarde moet > 0,05 zijn
- Modulo bias — Maakt de code gebruik van afwijzingssteekproeven of een onbevooroordeelde mappingmethode?
- Onafhankelijkheid — Zijn opeenvolgende trekkingen gecorreleerd? Voer een autocorrelatietest uit op grote voorbeeldsets
- Codebeoordeling — Is de tekencode open source of controleerbaar? Verborgen code kan achterdeurtjes bevatten
- Filtering openbaarmaking — Worden resultaten gefilterd, opnieuw ingedeeld of uitgesloten? Dit moet openbaar worden gemaakt
- Timing — Kan de operator resultaten zien voordat deze worden gepubliceerd? Zo ja, dan kunnen ze selectief ongunstige trekkingen weggooien
Transparantiepatroon voor openbare loterijen
Voor trekkingen met hoge inzetten (prijzen, opdrachten, selecties) gebruik je een commit-reveal-schema:
- Voor de trekking: Genereer een willekeurig zaadje. Publiceer de SHA-256-hash (de "toezegging"), bijvoorbeeld op sociale media of een document met tijdstempel
- Voer de trekking uit: Gebruik de Seed om resultaten te genereren met een deterministisch algoritme
- Na de trekking: Publiceer het zaad. Iedereen kan dat verifiëren:
- Het zaad produceert de gepubliceerde hash
- Het zaad + algoritme produceert de aangekondigde resultaten
Gebruik onze Hash Generator om de commitment-hash te maken en te verifiëren.
// Commitmentfase
const zaad = crypto.randomBytes(32).toString('hex');
const inzet = sha256(zaad); // publiceer dit vóór de trekking // Tekenfase
const resultaat = deterministicDraw(zaad, deelnemers); // Onthullingsfase
// publiceer zaad - iedereen kan sha256(seed) === commitment verifiëren Eerlijkheid communiceren naar gebruikers
Vertrouwen vereist transparantie. Bij openbare trekkingen:
- Vermeld de gebruikte RNG-methode (bijvoorbeeld 'Web Crypto API')
- Publiceer het tekenalgoritme (zelfs pseudocode helpt)
- Gebruik commit-reveal voor verifieerbaarheid
- Registratielogboeken opnemen en publiceren met tijdstempels
- Laat onafhankelijke waarnemers de resultaten verifiëren
Veelgestelde vragen
Is Math.random goed genoeg?
Nee. Math.random() gebruikt een pseudo-random number generator (PRNG) die niet cryptografisch veilig is. De output ervan kan worden voorspeld als de interne toestand bekend is. Voor eerlijke trekkingen gebruikt u crypto.getRandomValues() in de browser of crypto.randomInt() in Node.js.
Hoe kan ik bewijzen dat een gelijkspel niet is gemanipuleerd?
Gebruik een commit-reveal-schema: publiceer vóór de trekking een hash van het willekeurige zaad (commitment). Na de trekking onthul je het zaad. Iedereen kan verifiëren dat het zaad de gepubliceerde hash en de aangekondigde resultaten oplevert.
Hoeveel monsters heb ik nodig voor basiscontroles op bias?
Voor een eenvoudige uniformiteitscontrole over N uitkomsten heb je minimaal 100×N monsters nodig (bijvoorbeeld 1.000 monsters voor een trekking met 10 opties). Pas een chikwadraattoets toe: als de p-waarde boven de 0,05 ligt, is de verdeling redelijk uniform. Gebruik voor serieuze audits meer dan 10.000 voorbeelden.
Gerelateerde tools en artikelen
- Random Number Generator — cryptografisch eerlijke willekeurige getallen
- Hashgenerator — creëer commitment-hashes voor verifieerbare trekkingen
- Waarom een pincodegenerator gebruiken? — beveilig willekeurige pincodes
- Checklist voor digitale hygiëne — algemene beveiligingspraktijken