> tilfældig talgenerator <
// Generér kryptografisk tilfældige heltal og decimaltal — eller seed den for reproducerbare kørsler
Kryptografisk tilfældighed
Bruger som standard crypto.getRandomValues() med rejection sampling, så hvert heltal i dit interval er lige sandsynligt — ingen modulo-bias.
Reproducerbar seedet tilstand
Angiv en vilkårlig seed-streng for at skifte til en deterministisk mulberry32-PRNG. Samme seed, samme tal — perfekt til test og simuleringer.
Tilstand uden dubletter
Generér unikke heltal via sampling i Fisher-Yates-stil. Glimrende til lotteritrækninger, lodtrækninger eller stikprøver uden tilbagelægning.
Styring af decimalpræcision
Skift til decimaltilstand og vælg 1-10 decimaler. Tallene er ensartet fordelt over [min, maks) og afrundet til den valgte præcision.
// OM GENERERING AF TILFÆLDIGE TAL
Sådan virker det:
Når seed-feltet er tomt, kalder dette værktøj crypto.getRandomValues(new Uint32Array(1)), en CSPRNG (kryptografisk sikker PRNG), der drives af dit operativsystems entropipulje. For at afbilde et 32-bit fortegnsløst heltal på et vilkårligt [min, max]-interval uden modulo-bias bruger generatoren rejection sampling: enhver trækning over det største multiplum af intervallet, der passer i 2^32, kasseres og trækkes igen. Når du angiver et seed, hashes strengen med cyrb53 til et 32-bit heltal og føres ind i mulberry32, en hurtig 32-bit PRNG med en periode på 2^32 — deterministisk og reproducerbar. Decimaltilstand skalerer en ensartet [0,1)-stikprøve til [min, max) og formaterer derefter med toFixed(places).
Eksempel:
min=1, max=100, count=5, seed="hello" -> 39, 98, 64, 12, 71 (altid)
Standarder og referencer:
- >Web Crypto API (W3C) —
crypto.getRandomValues()-kontrakt for CSPRNG'er - >RFC 4086 — Randomness Requirements for Security
- >mulberry32 — 32-bit PRNG af Tommy Ettinger, public domain
- >cyrb53 — hurtig 53-bit streng-hash til seeding (bryc, public domain)
Almindelige anvendelsesscenarier:
- >Lotteri- og lodtrækninger med påviseligt unikke udtræk
- >Tilfældig stikprøvetagning uden tilbagelægning til undersøgelser og revisioner
- >Monte Carlo-simuleringer og statistiske eksperimenter
- >A/B-test-bucketing med reproducerbare seedede tildelinger
- >Spilmekanik: terningeerstatninger, loot-tabeller, bane-seeds
- >QA-testdata og generering af fuzzing-input
- >Udvælgelse af vindere, dommere eller første oplægsholdere på møder
- >Generering af syntetiske data til prototyper og demoer
Relaterede værktøjer:
- >UUID-generator — tilfældige v4-identifikatorer, når du har brug for et unikt id frem for et tal
- >Adgangskodegenerator — kryptografisk tilfældige strenge med styring af tegnsættet
- >BIP39-generator — tilfældige mnemoniske seed-fraser til kryptopunge
- >randompickerwheel.app — lykkehjul-grænseflade, når du ønsker en visuel tilfældig vælger til et live publikum eller en skoleklasse
// EKSEMPLER PÅ OUTPUT
Lotteritrækning — 6 unikke tal fra 1-49
min=1, max=49, count=6, no-duplicates=on, sort=ascending
output:
7, 13, 22, 28, 35, 41
Terningeerstatning — ti d20-kast (dubletter tilladt)
min=1, max=20, count=10, no-duplicates=off, sort=none
output:
14, 3, 20, 11, 7, 14, 2, 19, 8, 11
Decimalstikprøve — 5 floats i [0, 1) med 4 decimaler
type=decimal, min=0, max=1, count=5, places=4
output:
0.4172, 0.8635, 0.0291, 0.5508, 0.7723
Seedet reproducerbar — samme seed giver samme sekvens
min=1, max=100, count=5, seed="hello" (kør to gange)
output:
Kørsel 1: 39, 98, 64, 12, 71 / Kørsel 2: 39, 98, 64, 12, 71
Bucketing — 100 vægtede A/B-udtræk via heltals-modulo
min=0, max=99, count=100, seed="experiment-42", sort=ascending
output:
0, 1, 3, 4, 7, 9, 12, ... 95, 97, 98, 99 (deterministisk)
// IMPLEMENTÉR DET SELV
Hvis du hellere vil lægge algoritmen direkte ind i dit eget projekt, er her de tre primitiver, som dette værktøj er bygget på. Tilsammen dækker de uvildige kryptografiske heltal, deterministiske seedede strømme og omdannelse af et vilkårligt streng-seed til en 32-bit PRNG-tilstand. Alle er public domain eller MIT-ækvivalente.
Kryptografisk sikkert heltal i [min, max] (ingen 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 — deterministisk seedet PRNG (32-bit tilstand, ~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 — hurtig streng-til-32bit-hash (brug til at seede mulberry32)
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'));
// ALMINDELIGE FALDGRUBER
> Modulo-bias
Et naivt Math.floor(Math.random() * range) fordeler de høje bit ujævnt, når intervallet ikke er en potens af to — nogle output forekommer en smule oftere end andre. Brug rejection sampling (kodestumpen ovenfor) til at kassere trækninger uden for intervallet og holde fordelingen ensartet.
> Math.random() er ikke kryptografisk sikker
Math.random() bruger i V8/Spidermonkey xorshift128+, som er hurtig, men forudsigelig: en angriber, der observerer nogle få output, kan genskabe den interne tilstand og forudsige fremtidige værdier. Til tokens, salte, retfærdighedskritiske lotteritrækninger eller alt, som en modstander interesserer sig for, skal du altid bruge crypto.getRandomValues().
> Seedede PRNG'er er deterministiske — brug dem aldrig til sikkerhed
Mulberry32 og lignende er designet til at gentage sig. Det er præcis, hvad du ønsker til test, simuleringer og bucketing — og præcis, hvad du ikke ønsker til tokens til nulstilling af adgangskoder eller sessions-id'er. Hvis du opdager, at du sender et seed ind i noget brugervendt eller autentificeringsnært, så skift straks tilbage til CSPRNG'en.
> Dublet-afvisning ved højt antal udtømmer kapaciteten
At bede om k unikke heltal fra et interval af størrelse n, hvor k nærmer sig n, bliver til et coupon-collector-problem: de sidste få udtræk bliver eksponentielt dyre. Dette værktøj begrænser til 10.000 og bruger partiel Fisher-Yates-sampling, så kapaciteten er præcis, men en naiv while-løkke med seen.has(x) hænger lydløst, når k > n. Tjek altid kapaciteten på forhånd.
>> ofte stillede spørgsmål
Sp.: Er denne tilfældige talgenerator kryptografisk sikker?
Sv.: Ja, som standard. Når du lader SEED-feltet stå tomt, bruger værktøjet crypto.getRandomValues(), Web Crypto API'ets CSPRNG, som på Linux/macOS læser fra /dev/urandom og på Windows fra BCryptGenRandom. Vi anvender også rejection sampling, så afbildningen fra et 32-bit heltal til dit brugerdefinerede interval er uvildig. Outputtet er egnet til sikkerhedsnære opgaver som at generere tokens, vælge salte eller afholde retfærdige lotterier. Bemærk, at angivelse af et seed skifter til en deterministisk PRNG (mulberry32), som ikke er kryptografisk sikker — brug den kun, når reproducerbarhed betyder mere end hemmeligholdelse.
Sp.: Hvad er forskellen på seedet og ikke-seedet tilstand?
Sv.: Ikke-seedet tilstand (standard) bruger din browsers CSPRNG og producerer friske, uforudsigelige tal ved hvert klik — det samme kald vil aldrig returnere den samme sekvens to gange. Seedet tilstand hasher seed-strengen til et 32-bit heltal med cyrb53 og fører det ind i mulberry32, en deterministisk PRNG. Identisk seed plus identiske indstillinger giver altid den identiske sekvens, hvilket er uvurderligt til reproducerbare eksperimenter, fejlfinding af stokastisk kode, deling af test-fixtures eller A/B-test-bucketing, hvor hver bruger altid skal lande i samme bucket.
Sp.: Hvordan fungerer indstillingen uden dubletter?
Sv.: For heltal trækker uden-dubletter fra intervallet [min..max] ved hjælp af en delvis blanding inspireret af Fisher-Yates, der giver de første k elementer uden nogensinde at gentage. Vi bruger et tyndt byttekort, så hukommelsesforbruget forbliver O(count) frem for O(range), hvilket betyder, at et udtræk af 10 unikke tal fra 1 til 1.000.000 er lige så billigt som 10 fra 1 til 100. Hvis du beder om flere unikke tal, end intervallet kan levere (f.eks. 20 unikke heltal i 1-10), rapporterer værktøjet en tydelig kapacitetsfejl i stedet for at løkke i det uendelige.
Sp.: Kan jeg generere decimaltal (flydende komma)?
Sv.: Ja. Sæt TYPE-knappen til Decimaltal og vælg en præcision mellem 1 og 10 decimaler. Generatoren trækker et ensartet flydende-komma-tal i [0, 1), skalerer det til [min, max), afrunder derefter med toFixed(places) og fortolker det tilbage til et tal. Bemærk, at max er eksklusiv i decimaltilstand (en bivirkning af, hvordan flydende-komma-ensartethed defineres). Til de fleste statistiske formål er 4-6 decimaler rigeligt; ti decimaler nærmer sig grænsen for IEEE 754-dobbeltpræcision for typiske små intervaller.
Sp.: Findes der et maksimalt antal?
Sv.: Antallet er begrænset til 10.000 tal pr. klik. Det holder siden responsiv på telefoner og undgår grænsetilfælde i browseradfærd omkring ekstremt store tekstområder. Hvis du har brug for millioner af værdier, så kør flere batches med forskellige seeds og sammensæt outputtet, eller kopiér algoritmen ind i et Node-script — det samme mulberry32-/cyrb53-par virker også på serversiden. Af hensyn til brugeroplevelsen sker sortering, kopiering og download alt sammen på klientsiden, så 10k er et fornuftigt loft, der stadig bliver færdigt på langt under et millisekund på en moderne bærbar.
Sp.: Bliver mine data uploadet nogen steder?
Sv.: Nej. Hver handling kører i din browser som almindelig JavaScript: talgenerering, sortering, statistik, kopiering til udklipsholderen og download af .txt-filen. Der sendes ingen forespørgsel til vores servere, når du klikker på GENERATE, COPY eller DOWNLOAD — du kan verificere det med din browsers Netværk-fane. Vi logger ikke seeds, intervaller eller output. Siden er statisk HTML, der serveres over HTTPS fra et CDN, så intet om dit input er nogensinde observerbart for os. Det gør værktøjet sikkert til fortrolige test-fixtures, interne lotteri-seeds eller alt andet, du helst vil holde væk fra tredjepartsservere.
Sp.: Kan jeg undgå dubletter, når jeg genererer decimaltal?
Sv.: Ja, afkrydsningsfeltet uden dubletter gælder også for decimaltal via en best-effort gentagelsesløkke. Da to uafhængigt udtagne floats næsten aldrig kolliderer på bitniveau, er dubletter sjældne, medmindre dit interval er lille i forhold til præcisionen (f.eks. har min=0, max=1, places=2 kun 100 forskellige værdier). Hvis løkken ikke kan finde nok unikke værdier inden for et rimeligt antal forsøg, rapporterer værktøjet en kapacitetsfejl, så du kan udvide intervallet eller øge præcisionen. Til strengt garanteret unikke decimaltal er det bedst at bruge heltalstilstand og selv dividere resultatet.
Sp.: Hvornår skal jeg bruge et lykkehjul i stedet for en talliste?
Sv.: En talliste er bedst til batchopgaver: at trække 50 lodsedler, generere testdata eller fodre en simulering. Et lykkehjul er bedre, når én person udvælger ét element foran et publikum, og du ønsker spændingen og den visuelle effekt — navneudtræk i klassen, livestream-konkurrencer, børns pligtrotation, beslutningsmøder. Hvis det er dit anvendelsesscenarie, så se randompickerwheel.app, som tilbyder en interaktiv lykkehjul-grænseflade bygget til netop dette øjeblik. Begge værktøjer trækker fra den samme CSPRNG-primitiv — forskellen er præsentation, ikke retfærdighed.