> willekeurige getallengenerator <
// Genereer cryptografisch willekeurige gehele getallen en decimalen — of gebruik een seed voor reproduceerbare runs
Cryptografische willekeurigheid
Gebruikt standaard crypto.getRandomValues() met rejection sampling, zodat elk geheel getal in je bereik even waarschijnlijk is — geen modulo-bias.
Reproduceerbare seed-modus
Geef een willekeurige seed-tekenreeks op om over te schakelen naar een deterministische mulberry32-PRNG. Zelfde seed, zelfde getallen — perfect voor tests en simulaties.
Modus zonder duplicaten
Genereer unieke gehele getallen via sampling in Fisher-Yates-stijl. Ideaal voor loterijtrekkingen, verlotingen of steekproeven zonder teruglegging.
Beheer van decimale precisie
Schakel over naar de decimale modus en kies 1–10 decimalen. Getallen zijn uniform verdeeld over [min, max) en afgerond op de gekozen precisie.
// OVER HET GENEREREN VAN WILLEKEURIGE GETALLEN
Hoe het werkt:
Wanneer het seed-veld leeg is, roept deze tool crypto.getRandomValues(new Uint32Array(1)) aan, een CSPRNG (cryptografisch veilige PRNG) die wordt gevoed door de entropiepool van je besturingssysteem. Om een 32-bits geheel getal zonder teken zonder modulo-bias op een willekeurig [min, max]-bereik af te beelden, gebruikt de generator rejection sampling: elke trekking boven het grootste veelvoud van het bereik dat in 2^32 past, wordt verworpen en opnieuw getrokken. Wanneer je een seed opgeeft, wordt de tekenreeks met cyrb53 gehasht naar een 32-bits geheel getal en doorgegeven aan mulberry32, een snelle 32-bits PRNG met een periode van 2^32 — deterministisch en reproduceerbaar. De decimale modus schaalt een uniforme [0,1)-steekproef naar [min, max) en formatteert vervolgens met toFixed(places).
Voorbeeld:
min=1, max=100, count=5, seed="hello" -> 39, 98, 64, 12, 71 (altijd)
Standaarden & referenties:
- >Web Crypto API (W3C) —
crypto.getRandomValues()-contract voor CSPRNG's - >RFC 4086 — Randomness Requirements for Security
- >mulberry32 — 32-bits PRNG van Tommy Ettinger, publiek domein
- >cyrb53 — snelle 53-bits tekenreeks-hash voor seeding (bryc, publiek domein)
Veelvoorkomende gebruiksscenario's:
- >Loterij- en verlotingstrekkingen met aantoonbaar unieke keuzes
- >Willekeurige steekproeven zonder teruglegging voor enquêtes en audits
- >Monte-Carlo-simulaties en statistische experimenten
- >A/B-test-bucketing met reproduceerbare seed-toewijzingen
- >Spelmechanismen: dobbelsteenvervangers, loot-tabellen, level-seeds
- >QA-testgegevens en het genereren van fuzzing-invoer
- >Het kiezen van winnaars, juryleden of eerste sprekers in vergaderingen
- >Genereren van synthetische gegevens voor prototypes en demo's
Gerelateerde tools:
- >UUID-generator — willekeurige v4-identificatoren wanneer je een unieke ID nodig hebt in plaats van een getal
- >Wachtwoordgenerator — cryptografisch willekeurige tekenreeksen met beheer van de tekenset
- >BIP39-generator — willekeurige mnemonische seed-zinnen voor crypto-wallets
- >randompickerwheel.app — rad-van-fortuin-interface wanneer je een visuele willekeurige kiezer wilt voor een live publiek of een schoolklas
// VOORBEELDUITVOER
Loterijtrekking — 6 unieke getallen uit 1-49
min=1, max=49, count=6, no-duplicates=on, sort=ascending
output:
7, 13, 22, 28, 35, 41
Dobbelsteenvervanger — tien d20-worpen (duplicaten toegestaan)
min=1, max=20, count=10, no-duplicates=off, sort=none
output:
14, 3, 20, 11, 7, 14, 2, 19, 8, 11
Decimale steekproef — 5 floats in [0, 1) met 4 decimalen
type=decimal, min=0, max=1, count=5, places=4
output:
0.4172, 0.8635, 0.0291, 0.5508, 0.7723
Reproduceerbaar met seed — dezelfde seed levert dezelfde reeks
min=1, max=100, count=5, seed="hello" (twee keer uitvoeren)
output:
Run 1: 39, 98, 64, 12, 71 / Run 2: 39, 98, 64, 12, 71
Bucketing — 100 gewogen A/B-keuzes via integer-modulo
min=0, max=99, count=100, seed="experiment-42", sort=ascending
output:
0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (deterministisch)
// IMPLEMENTEER HET ZELF
Als je het algoritme liever rechtstreeks in je eigen project zet, vind je hier de drie primitieven waarop deze tool is gebouwd. Samen dekken ze onvertekende cryptografische gehele getallen, deterministische seeded streams en het omzetten van een willekeurige tekenreeks-seed in een 32-bits PRNG-toestand. Alle publiek domein of MIT-equivalent.
Cryptografisch veilig geheel getal in [min, max] (geen modulo-bias)
function secureRandomInt(min, max) {
const range = max - min + 1;
const buf = new Uint32Array(1);
const max32 = 0xFFFFFFFF;
const limit = Math.floor((max32 + 1) / range) * range;
let v;
do {
crypto.getRandomValues(buf);
v = buf[0];
} while (v >= limit);
return min + (v % range);
}
mulberry32 — deterministische seeded PRNG (32-bits toestand, ~2^32 periode)
function mulberry32(seed) {
let a = seed >>> 0;
return function () {
a = (a + 0x6D2B79F5) | 0;
let t = a;
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
// usage: const rng = mulberry32(0xC0FFEE);
// rng(); // 0.6743..., reproducible across runs
cyrb53 — snelle tekenreeks-naar-32bit-hash (gebruik om mulberry32 te seeden)
function cyrb53(str, seed) {
seed = seed || 0;
let h1 = 0xdeadbeef ^ seed;
let h2 = 0x41c6ce57 ^ seed;
for (let i = 0; i < str.length; i++) {
const ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761);
h2 = Math.imul(h2 ^ ch, 1597334677);
}
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^
Math.imul(h2 ^ (h2 >>> 13), 3266489909);
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^
Math.imul(h1 ^ (h1 >>> 13), 3266489909);
return (h1 >>> 0);
}
// const rng = mulberry32(cyrb53('my-seed-string'));
// VEELVOORKOMENDE VALKUILEN
> Modulo-bias
Een naïef Math.floor(Math.random() * range) verdeelt de hoge bits ongelijkmatig wanneer het bereik geen macht van twee is — sommige uitkomsten komen iets vaker voor dan andere. Gebruik rejection sampling (het fragment hierboven) om trekkingen buiten het bereik te verwerpen en de verdeling uniform te houden.
> Math.random() is niet cryptografisch veilig
Math.random() gebruikt in V8/Spidermonkey xorshift128+, dat snel maar voorspelbaar is: een aanvaller die enkele uitkomsten waarneemt, kan de interne toestand herstellen en toekomstige waarden voorspellen. Gebruik voor tokens, salts, eerlijkheidskritische loterijtrekkingen of alles waar een tegenstander om geeft, altijd crypto.getRandomValues().
> Seeded PRNG's zijn deterministisch — gebruik ze nooit voor beveiliging
Mulberry32 en soortgenoten zijn ontworpen om zich te herhalen. Dat is precies wat je wilt voor tests, simulaties en bucketing — en precies wat je niet wilt voor tokens voor wachtwoordherstel of sessie-ID's. Als je merkt dat je een seed doorgeeft aan iets dat zichtbaar is voor de gebruiker of dicht bij authenticatie staat, schakel dan onmiddellijk terug naar de CSPRNG.
> Duplicaatafwijzing bij hoog aantal put de capaciteit uit
Het vragen om k unieke gehele getallen uit een bereik van grootte n waarbij k n nadert, wordt een coupon-collector-probleem: de laatste trekkingen worden exponentieel duur. Deze tool beperkt tot 10.000 en gebruikt partiële Fisher-Yates-sampling zodat de capaciteit exact is, maar een naïeve while-lus met seen.has(x) blijft stilletjes hangen wanneer k > n. Controleer de capaciteit altijd vooraf.
>> veelgestelde vragen
V: Is deze willekeurige getallengenerator cryptografisch veilig?
A: Ja, standaard. Wanneer je het SEED-veld leeg laat, gebruikt de tool crypto.getRandomValues(), de CSPRNG van de Web Crypto API, die op Linux/macOS leest uit /dev/urandom en op Windows uit BCryptGenRandom. We passen ook rejection sampling toe, zodat de afbeelding van een 32-bits geheel getal naar je aangepaste bereik onvertekend is. De uitvoer is geschikt voor beveiligingsgerelateerde taken zoals het genereren van tokens, het kiezen van salts of het uitvoeren van eerlijke loterijen. Merk op dat het opgeven van een seed overschakelt naar een deterministische PRNG (mulberry32), die niet cryptografisch veilig is — gebruik die alleen wanneer reproduceerbaarheid belangrijker is dan geheimhouding.
V: Wat is het verschil tussen de seeded en niet-seeded modus?
A: De niet-seeded modus (standaard) gebruikt de CSPRNG van je browser en produceert bij elke klik verse, onvoorspelbare getallen — dezelfde aanroep zal nooit twee keer dezelfde reeks teruggeven. De seeded modus hasht de seed-tekenreeks met cyrb53 naar een 32-bits geheel getal en voert die in mulberry32, een deterministische PRNG. Een identieke seed plus identieke instellingen leveren altijd de identieke reeks op, wat onmisbaar is voor reproduceerbare experimenten, het debuggen van stochastische code, het delen van test-fixtures of A/B-test-bucketing waarbij elke gebruiker altijd in dezelfde bucket moet belanden.
V: Hoe werkt de optie zonder duplicaten?
A: Voor gehele getallen trekt de optie zonder duplicaten uit het bereik [min..max] met een door Fisher-Yates geïnspireerde gedeeltelijke shuffle die de eerste k elementen levert zonder ooit te herhalen. We gebruiken een ijle wisselmap zodat het geheugengebruik O(count) blijft in plaats van O(range), wat betekent dat een trekking van 10 unieke getallen uit 1 tot 1.000.000 net zo goedkoop is als 10 uit 1 tot 100. Als je om meer unieke getallen vraagt dan het bereik kan leveren (bijv. 20 unieke gehele getallen in 1–10), meldt de tool een duidelijke capaciteitsfout in plaats van eindeloos te blijven lussen.
V: Kan ik willekeurige decimale (drijvende-komma) getallen genereren?
A: Ja. Zet de TYPE-keuzeknop op Decimaal en kies een precisie tussen 1 en 10 decimalen. De generator trekt een uniforme float in [0, 1), schaalt die naar [min, max), rondt vervolgens af met toFixed(places) en parseert terug naar een getal. Merk op dat max in de decimale modus exclusief is (een neveneffect van hoe drijvende-komma-uniformiteit gedefinieerd is). Voor de meeste statistische toepassingen zijn 4–6 decimalen ruim voldoende; tien decimalen benaderen de grens van IEEE 754-dubbele precisie voor typische kleine bereiken.
V: Is er een maximaal aantal?
A: Het aantal is beperkt tot 10.000 getallen per klik. Dat houdt de pagina responsief op telefoons en vermijdt randgevalgedrag van browsers rond extreem grote tekstvelden. Als je miljoenen waarden nodig hebt, voer dan meerdere batches uit met verschillende seeds en plak de uitvoer aan elkaar, of kopieer het algoritme naar een Node-script — hetzelfde mulberry32/cyrb53-paar werkt ook aan de serverkant. Om UX-redenen gebeuren sorteren, kopiëren en downloaden allemaal aan de clientkant, dus 10k is een verstandig plafond dat op een moderne laptop toch ruim binnen een milliseconde klaar is.
V: Worden mijn gegevens ergens geüpload?
A: Nee. Elke bewerking draait in je browser als gewone JavaScript: getallengeneratie, sorteren, statistieken, kopiëren naar het klembord en het downloaden van het .txt-bestand. Er wordt geen verzoek naar onze servers gestuurd wanneer je op GENERATE, COPY of DOWNLOAD klikt — je kunt dit verifiëren met het tabblad Netwerk van je browser. We loggen geen seeds, bereiken of uitvoer. De pagina is statische HTML die via HTTPS vanaf een CDN wordt geleverd, dus niets van je invoer is ooit voor ons waarneembaar. Dat maakt de tool veilig voor vertrouwelijke test-fixtures, interne loterij-seeds of al het andere dat je liever buiten servers van derden houdt.
V: Kan ik duplicaten vermijden bij het genereren van decimale getallen?
A: Ja, het selectievakje zonder duplicaten geldt ook voor decimalen via een best-effort herhaallus. Omdat twee onafhankelijk getrokken floats vrijwel nooit op bitniveau botsen, zijn duplicaten zeldzaam tenzij je bereik klein is ten opzichte van de precisie (bijv. min=0, max=1, places=2 heeft slechts 100 verschillende waarden). Als de lus niet binnen een redelijk aantal pogingen genoeg unieke waarden vindt, meldt de tool een capaciteitsfout zodat je het bereik kunt verbreden of de precisie kunt verhogen. Voor strikt gegarandeerd unieke decimalen kun je beter de integer-modus gebruiken en het resultaat zelf delen.
V: Wanneer moet ik een draaiend rad gebruiken in plaats van een getallenlijst?
A: Een getallenlijst is het beste voor batchtaken: het trekken van 50 loten, het genereren van testgegevens of het voeden van een simulatie. Een draaiend rad is beter wanneer één persoon één item kiest voor een publiek en je de spanning en het visuele effect wilt — naamkeuze in de klas, livestream-weggeefacties, klusrotaties voor kinderen, besluitvormingsvergaderingen. Als dat jouw gebruiksscenario is, bekijk dan randompickerwheel.app, dat een interactieve rad-van-fortuin-interface biedt die precies voor dat moment is gemaakt. Beide tools putten uit dezelfde CSPRNG-primitieve — het verschil zit in de presentatie, niet in de eerlijkheid.