ADVERTISEMENT

Mobile Banner
320×100

Willekeurig Getal Generator

Genereer willekeurige getallen binnen elk bereik dat je opgeeft

Hoe Willekeurige Getallen Werken

Bereikformule
Formule laden...
Uniforme Verdeling
Formule laden...
Kans
Formule laden...

PRNG, CSPRNG en TRNG: drie soorten willekeur

Een pseudo-willekeurige getallengenerator (PRNG) is een deterministisch algoritme: met dezelfde seed produceert het exact dezelfde reeks. Dat is handig voor reproduceerbare simulaties of regressietesten, maar onbruikbaar voor beveiliging omdat een aanvaller die de seed of een paar uitkomsten kent de hele reeks kan reconstrueren. Klassieke PRNG's zoals xorshift128+ en Mersenne Twister vallen in deze categorie.

Een cryptografisch veilige PRNG (CSPRNG) lost dit op door te seeden vanuit de entropy-pool van het besturingssysteem (Linux /dev/urandom, Windows BCryptGenRandom) en interne toestand zo te mengen dat eerdere of toekomstige waarden niet te voorspellen zijn, zelfs niet als een deel van de uitvoer bekend is. NIST SP 800-90A Rev. 1 beschrijft drie goedgekeurde constructies: Hash_DRBG, HMAC_DRBG en CTR_DRBG.

Een true random number generator (TRNG) wint entropie uit een fysiek proces: thermische ruis in een halfgeleider, atmosferische ruis (zoals random.org gebruikt) of kwantumeffecten in een foton-detector. De uitvoer is in principe niet reproduceerbaar, ook niet met volledige kennis van het verleden. Voor de meeste toepassingen volstaat een CSPRNG; een TRNG is vooral nodig voor het seeden van de pool en voor gecertificeerde trekkingen.

Math.random() versus crypto.getRandomValues() in de browser

JavaScript biedt twee bronnen van willekeur. Math.random() is een snelle, niet-cryptografische PRNG; V8 gebruikt sinds 2015 een xorshift128+-variant. MDN waarschuwt expliciet dat Math.random() niet geschikt is voor enig beveiligingsgerelateerd doel: een aanvaller kan de interne toestand reconstrueren uit ongeveer vijf opeenvolgende waarden, waardoor verleden en toekomst voorspelbaar worden.

crypto.getRandomValues() is onderdeel van de Web Cryptography API (W3C, 2017) en levert een CSPRNG die wordt geseed vanuit OS-entropie. Het is bedoeld voor sleutels, tokens, wachtwoorden en elke trekking die manipulatie moet weerstaan. Deze generator gebruikt crypto.getRandomValues() met rejection sampling: 32-bit waarden die het bereik scheef zouden trekken worden weggegooid en opnieuw gegenereerd, zodat elk getal in [min, max] precies dezelfde kans 1 / (max - min + 1) heeft.

Gebruik in loterijen, verlotingen en onderzoeksrandomisatie

Voor verlotingen tijdens bedrijfsevenementen, schoolprijsuitreikingen of bingo-avonden volstaat een CSPRNG in de browser ruimschoots: zet duplicaten uit, leg het bereik en het aantal vast, en bewaar een screenshot van de instellingen en de volledige uitslag. Dit is voldoende voor de transparantie die de Algemene Voorwaarden Promotionele Kansspelen (APK) van de Kansspelautoriteit verlangen voor kleinschalige promotionele kansspelen tot 4.500 euro prijzenpot.

Voor wetenschappelijk onderzoek (gerandomiseerd toewijzen van proefpersonen aan condities, A/B-tests, steekproeftrekkingen) is een CSPRNG geschikt mits het randomisatieschema vooraf in het studieprotocol wordt vastgelegd en de seed of de gebruikte methode wordt gedocumenteerd. CCMO en METC verwachten bij klinisch onderzoek een traceerbare randomisatieprocedure conform ICH GCP E6 (R2).

Voor grote vergunninghouders (Staatsloterij, Postcode Loterij, BankGiro Loterij, VriendenLoterij) gelden strengere eisen: hier worden trekkingen uitgevoerd met mechanische trommels of gecertificeerde hardware-RNG's onder toezicht van een notaris, omdat de Wet op de Kansspelen (Wok) en de vergunningvoorwaarden van de Kansspelautoriteit een aantoonbaar onafhankelijke en auditeerbare trekking eisen.

Nederlandse loterijen en certificering van trekkingssystemen

De Kansspelautoriteit (Ksa) verleent in Nederland de vergunningen voor grote loterijen op grond van de Wet op de Kansspelen. Vergunninghouders moeten aantonen dat hun trekkingssysteem voldoet aan de eisen voor eerlijkheid en niet-manipuleerbaarheid; voor online kansspelen geldt sinds 1 oktober 2021 een aanvullend technisch toetsingskader (Regeling kansspelen op afstand) dat onder meer eist dat de RNG is gecertificeerd door een door de Ksa erkende keuringsinstelling zoals GLI of eCOGRA, met testprotocollen gebaseerd op onder meer NIST SP 800-22 (statistische test-suite voor willekeur).

De Staatsloterij voert haar reguliere trekkingen uit met mechanische trekkingsmachines onder notarieel toezicht, terwijl de Nationale Postcode Loterij voor wekelijkse trekkingen een combinatie van mechanische trommels en geauditeerde software inzet. Voor consumenten zijn de trekkingsrapporten via de respectieve websites openbaar; voor zakelijke promotionele acties tot 4.500 euro is een eigen, transparante procedure voldoende mits het reglement vooraf wordt gepubliceerd en de winnaars binnen drie maanden bekend worden gemaakt (APK artikel 4).

NIST SP 800-90A en NCSC-advies voor beveiligingscontext

NIST Special Publication 800-90A Rev. 1 (juni 2015) definieert de drie deterministische random bit generators die als veilig worden beschouwd voor cryptografische toepassingen: Hash_DRBG (op basis van een hashfunctie), HMAC_DRBG (op basis van een keyed HMAC) en CTR_DRBG (op basis van een blokcijfer in counter-mode, meestal AES). Een eerdere variant, Dual_EC_DRBG, is in 2014 ingetrokken nadat onderzoekers aantoonden dat de constantes mogelijk een backdoor bevatten.

Het Nationaal Cyber Security Centrum (NCSC) van het Ministerie van Justitie en Veiligheid verwijst in zijn ICT-beveiligingsrichtlijnen voor TLS naar de noodzaak van een CSPRNG voor het genereren van sleutels en sessietokens, en raadt expliciet af om bibliotheekfuncties zoals rand() of Math.random() te gebruiken voor beveiligingsdoeleinden. ENISA bevestigt deze lijn in haar Algorithms, Key Sizes and Parameters Report en adviseert minimaal 128 bit entropie voor symmetrische sleutels gegenereerd met een NIST SP 800-90A-conforme generator.

Voorbeelden

Trek een willekeurig getal tussen 1 en 100

Een docent wil een van de 100 leerlingen willekeurig oproepen. Bereik 1 tot 100, één getal, duplicaten irrelevant bij hoeveelheid 1.

ResultaatEén geheel getal in [1, 100], elk met kans 1/100 = 1%.

De browser roept crypto.getRandomValues() aan om een 32-bit unsigned integer te vullen, verwerpt waarden die het resultaat scheef zouden trekken (rejection sampling) en mapt de resterende waarde naar het inclusieve bereik 1-100 via min + floor(r * (max - min + 1)). Omdat crypto.getRandomValues wordt geseed vanuit de OS-entropy-pool, is de uitkomst niet te voorspellen uit eerdere trekkingen.

Vijf getallen 1-49 (Lotto-stijl, Staatsloterij Lotto)

Een speler wil vijf unieke getallen voor een Lotto-formulier. Bereik 1 tot 49, vijf getallen, duplicaten uit.

ResultaatVijf unieke gehele getallen uit [1, 49], bijvoorbeeld 7, 14, 22, 31, 45.

De generator trekt achtereenvolgens vijf getallen via crypto.getRandomValues + rejection sampling. Na elke trekking wordt het getrokken getal verwijderd uit de pool van mogelijke waarden, zodat duplicaten zijn uitgesloten. De kans op een specifieke ongeordende combinatie van vijf nummers uit 49 is 1 / C(49,5) = 1 / 1.906.884. Dit is een hulpmiddel voor eigen formulieren, niet de officiële trekking; de Staatsloterij voert haar trekkingen uit met mechanische machines onder notarieel toezicht conform de vergunningvoorwaarden van de Kansspelautoriteit.

Tien getallen tussen 0 en 1 voor een steekproef

Een onderzoeker wil tien uniforme willekeurige waarden in [0, 1] voor een Monte Carlo-simulatie. Hier worden gehele getallen 0-1 getrokken; voor continue waarden wordt typisch crypto.getRandomValues / 2^32 gebruikt.

ResultaatReeks van tien 0/1-waarden, bijvoorbeeld 0, 1, 1, 0, 1, 0, 0, 1, 0, 1; gemiddeld 50% nullen en 50% enen.

Voor een Bernoulli(0,5)-steekproef is dit voldoende: elk getal heeft kans 0,5. Over tien trekkingen volgt het aantal enen een binomiale verdeling B(10; 0,5) met verwachte waarde 5 en standaarddeviatie ≈ 1,58. Voor een echte continue uniforme verdeling [0, 1) in JavaScript: const u = crypto.getRandomValues(new Uint32Array(1))[0] / 4294967296. Documenteer altijd of een PRNG of CSPRNG is gebruikt en, indien relevant, de seed of methode in het onderzoeksprotocol.

Veelgestelde vragen

Wat is het verschil tussen een PRNG, een CSPRNG en een TRNG?

Een PRNG (pseudo-random number generator) is een deterministisch algoritme: zelfde seed geeft zelfde reeks. Snel en reproduceerbaar, maar voorspelbaar voor wie de seed kent. Een CSPRNG (cryptografisch veilige PRNG) wordt geseed vanuit OS-entropie en mengt zijn interne toestand zo dat verleden en toekomst onvoorspelbaar zijn, ook bij kennis van een deel van de uitvoer; NIST SP 800-90A noemt Hash_DRBG, HMAC_DRBG en CTR_DRBG. Een TRNG (true RNG) wint entropie uit een fysiek proces zoals thermische of atmosferische ruis en is in principe niet reproduceerbaar. Deze tool gebruikt een CSPRNG via crypto.getRandomValues().

Welke certificering hebben Nederlandse loterijtrekkingen?

Vergunninghouders voor grote loterijen in Nederland (Staatsloterij, Postcode Loterij, BankGiro Loterij, VriendenLoterij) staan onder toezicht van de Kansspelautoriteit (Ksa) op grond van de Wet op de Kansspelen. Hun trekkingssystemen moeten aantoonbaar eerlijk en niet-manipuleerbaar zijn; voor online kansspelen (sinds 1 oktober 2021) eist het technisch toetsingskader van de Ksa dat de RNG is gecertificeerd door een erkende keuringsinstelling zoals GLI of eCOGRA, met statistische tests gebaseerd op onder meer NIST SP 800-22. Reguliere fysieke trekkingen van de Staatsloterij gebeuren met mechanische trekkingsmachines onder notarieel toezicht. Voor kleine promotionele kansspelen tot 4.500 euro prijzenpot volstaat een transparant reglement onder de Algemene Voorwaarden Promotionele Kansspelen.

Waarom is Math.random() onveilig voor beveiligingsdoeleinden?

Math.random() in moderne JavaScript-engines is een snelle niet-cryptografische PRNG, in V8 sinds 2015 gebaseerd op een xorshift128+-variant. De interne toestand kan worden gereconstrueerd uit ongeveer vijf opeenvolgende uitvoerwaarden, waarna verleden en toekomst voorspelbaar zijn. MDN waarschuwt expliciet tegen het gebruik van Math.random() voor iets beveiligingsgerelateerd. Voor tokens, sessie-ID's, wachtwoorden, encryptiesleutels en trekkingen die manipulatie moeten weerstaan moet je crypto.getRandomValues() gebruiken, conform de adviezen van het NCSC en ENISA.

Hoe groot is de invloed van de seed op de uitkomst?

Voor een gewone PRNG bepaalt de seed de volledige reeks: dezelfde seed leidt altijd tot exact dezelfde getallen, wat handig is voor reproduceerbare simulaties (zet de seed in je publicatie) maar fataal voor beveiliging als de seed te raden is (bijvoorbeeld een Unix-tijdstempel met seconde-precisie geeft slechts ~31 bit entropie). Een CSPRNG zoals crypto.getRandomValues() exposeert geen seed: hij wordt continu opnieuw geseed vanuit de OS-entropy-pool (Linux /dev/urandom, Windows BCryptGenRandom), die wordt gevoed met hardware-entropie zoals interrupt-timing, schijftoegang en, op moderne CPU's, RDRAND/RDSEED-instructies. Voor reproduceerbare wetenschappelijke simulaties gebruik je een aparte seeded PRNG (bijvoorbeeld Mulberry32 of PCG) en documenteer je de seed; voor beveiliging blijf je bij de CSPRNG zonder seed-controle.

Zijn de getallen uniform verdeeld over [min, max]?

Ja. De generator gebruikt rejection sampling, zodat elk geheel getal in [min, max] exact dezelfde kans 1 / (max - min + 1) heeft. Een naïeve aanpak met modulo op een 32-bit waarde introduceert kleine bias wanneer het bereik 2^32 niet gelijkmatig deelt; rejection sampling vermijdt dit door waarden in de 'rest'-zone te verwerpen en opnieuw te trekken. Over een groot aantal trekkingen convergeert het histogram naar vlak; standaard chi-kwadraat-toetsen op crypto.getRandomValues-uitvoer tonen geen statistisch significante afwijking van uniformiteit (zie NIST SP 800-22 test-suite).

Is dit voldoende voor een bedrijfsverloting of prijstrekking?

Voor promotionele kansspelen tot 4.500 euro prijzenpot (bedrijfsevenementen, social-media give-aways, schoolverlotingen) volstaat een CSPRNG in de browser ruimschoots, mits je het reglement vooraf publiceert, de instellingen (bereik, aantal, duplicaten) en de volledige uitslag vastlegt (screenshot of pdf met tijdstempel), en de winnaars binnen drie maanden bekendmaakt — zo voldoe je aan de Algemene Voorwaarden Promotionele Kansspelen van de Kansspelautoriteit. Voor grotere kansspelen heb je een Ksa-vergunning nodig, met een gecertificeerde RNG of mechanische trekking onder notarieel toezicht.

Hoe verschilt deze tool van random.org?

Random.org is een TRNG die atmosferische radioruis bemonstert op dedicated hardware in Ierland en gesigneerde, controleerbare trekkingen aanbiedt — handig voor publiekelijk te verantwoorden trekkingen en audits. Deze generator is een CSPRNG die volledig in je browser draait, zonder netwerkverkeer, dus sneller, offline bruikbaar en privacyvriendelijk, maar zonder onafhankelijk gesigneerd audit-spoor. Voor alledaagse willekeur zijn beide praktisch onvoorspelbaar; voor formeel te verantwoorden trekkingen is een gesigneerde random.org-trekking of een door de Kansspelautoriteit gecertificeerd systeem doorgaans de veiligere keuze.

Bronnen

Methodologie

Berekeningen gebruiken crypto.getRandomValues() (Web Cryptography API, W3C) met rejection sampling om uniforme verdeling over [min, max] te garanderen. Bij uitgeschakelde duplicaten wordt elk getrokken getal verwijderd uit de pool. Inhoud is afgestemd op NIST SP 800-90A, het technisch toetsingskader van de Kansspelautoriteit en NCSC/ENISA-richtlijnen voor cryptografische willekeur.

Handige Tips

  • Sla deze calculator op als bladwijzer voor snelle toegang
  • Gebruik de deelknop om je resultaten te versturen
  • Probeer verschillende scenario's om resultaten te vergelijken
  • Bekijk onze gerelateerde calculators voor meer informatie

Vind je deze calculator handig? Deel hem:

Sluit deze calculator in