Oslofokus Nyhetsoppdatering Norsk
OsloFokus.org Oslofokus Nyhetsoppdatering
Blogg Lokalt Næringsliv Politikk Teknologi Verden

Tilfeldig tall-generator – guide til funksjon og koding

Mats Ole Larsen Berg • 2026-06-20 • Kvalitetssikret av Daniel Berg

De fleste har brukt en tilfeldig tall-generator uten å tenke på hvordan den egentlig fungerer – enten det er for å trekke en vinner i et spill eller for å velge et tall mellom 1 og 100. Men bak de enkle resultatene skjuler det seg en viktig forskjell: noen generatorer gir pseudo-tilfeldige tall, mens andre, som de kryptografisk sikre variantene, er konstruert for å tåle angrep. I denne guiden får du vite hvordan de vanligste algoritmene fungerer, når du bør velge en sikker generator, og hvordan du koder din egen i Python.

Antall genererte tall per kjøring: 1 til flere tusen ·
Vanlig rekkevidde: 0–100, 1–100 eller tilpasset ·
Tilfeldighetskilde (maskinvarebasert): Atmosfærisk støy fra RANDOM.ORG ·
Sannsynlighetsfordeling: Jevn fordeling standard ·
Sikkerhetsklassifisering: Kryptografisk sikker (CSPRNG) eller ikke-sikker

Rask oversikt

1Bekreftede fakta
2Hva som er uklart
3Tidslinjesignal
4Hva skjer videre

De fire hovedpunktene viser én tydelig spenning: standardiserte algoritmer finnes, men tilliten til dem avhenger av implementering og sertifisering.

Nøkkelfakta Verdi Kilde
Vanlig standardalgoritme Hash DRBG, HMAC DRBG, CTR DRBG (NIST SP 800-90A) Wikipedia (NIST-sammendrag)
Kryptografisk tilfeldig data Tilgjengelig via Python secrets og Node.js randomBytes Python Software Foundation, Node.js
Sikkerhetsnivå Kryptografisk sikker (CSPRNG) for sensitive formål Python Software Foundation
Rekkevidde i Node.js randomBytes Heltall opp til 2^256 (32 byte) Node.js (JavaScript-kjøretid)

Mønsteret er tydelig: standardene er modne, men det er implementeringen som avgjør om du får en generator du kan stole på.

Hvordan fungerer en tilfeldig tall-generator?

Pseudo-tilfeldige vs. ekte tilfeldige tall

  • Pseudo-tilfeldige generatorer bruker en deterministisk algoritme med et frø (seed) for å produsere en sekvens som ser tilfeldig ut. NIST (amerikansk standardiseringsorgan) spesifiserer flere slike DRBG-er.
  • Ekte tilfeldige tall krever en fysisk kilde, som atmosfærisk støy – slik RANDOM.ORG bruker. Wikipedia (generell definisjon) beskriver forskjellen.

Vanlige algoritmer (f.eks. Mersenne Twister)

  • Mersenne Twister er en mye brukt pseudo-tilfeldig generator, spesielt i Python random-modul. Python-dokumentasjonen (standardbibliotek) bekrefter at den brukes som standard.
  • Den er rask, men ikke kryptografisk sikker – noe Node.js (JavaScript-kjøretid) understreker ved å skille mellom crypto.randomBytes og Math.random.
Hvorfor dette betyr noe

En pseudo-tilfeldig generator som Mersenne Twister er perfekt for spill og simuleringer, men den gir forutsigbare tall for en angriper som kjenner frøet. For kryptering må du bruke en CSPRNG.

Konsekvensen: velger du feil generator for jobben, kan sensitive data bli kompromittert. For hjemmebruk og læring er en enkel pseudo-tilfeldig generator helt grei.

Hvordan generere et tilfeldig tall mellom 1 og 100?

Bruk av nettbaserte generatorer

  • Nettverktøy som calculator.net lar deg angi nedre og øvre grense og generere ett eller flere tall umiddelbart. Calculator.net (etablert verktøy) tilbyr dette uten installasjon.
  • De fleste slike verktøy bruker JavaScripts Math.random() – raskt, men ikke kryptografisk sikkert.

Enkle kodeeksempler

  • I Python: import random; random.randint(1, 100) gir deg et heltall mellom 1 og 100. Python random-dokumentasjon (standardbibliotek) viser funksjonen.
  • I Node.js: Math.floor(Math.random() * 100) + 1. Node.js (JavaScript-kjøretid) advarer om at Math.random ikke er sikker.
Det du bør passe på

Math.random() i nettleseren er ikke kryptografisk sikker – for en loddtrekning med ekte innsats, bruk window.crypto.getRandomValues. MDN Web Docs (nettleserstandard) forklarer API-et.

Den underliggende regelen: tilfeldige tall fra kodebiblioteker er praktiske, men de er alltid deterministiske med mindre du eksplisitt henter fra en CSPRNG.

Hvordan generere flere tilfeldige tall samtidig?

Generering av lister

  • I Python kan du bruke random.sample(range(1, 100), 5) for å få fem unike tall. Python random-dokumentasjon (standardbibliotek) dokumenterer sample-metoden.
  • Node.js tilbyr mulighet til å generere en buffer med tilfeldige bytes via crypto.randomBytes(16) og deretter tolke dem som tall. Node.js (JavaScript-kjøretid) viser randomBytes.

Unik eller repetisjon

  • Ønsker du unike tall, bruk sampling uten tilbakelegging – ellers kan du la generatoreren kjøre med erstatning (kan gi duplikater).
  • For kryptografisk bruk er det ofte ønskelig med maksimum entropi, noe som krever en CSPRNG som secrets.SystemRandom() i Python. Python secrets (sikkerhetsmodul) anbefales.

Mønsteret: enten du trenger én eller tusen tall, er valget av generator og metode avgjørende for kvaliteten på tilfeldigheten.

Hva er en kryptografisk sikker tilfeldig tall-generator (CSPRNG)?

Bruksområder for CSPRNG

  • Passordgenerering, nøkkelgenerering og kryptering krever en CSPRNG. Python secrets (sikkerhetsmodul) er designet for dette.
  • Node.js randomBytes() er klassifisert som kryptografisk sterk pseudo-tilfeldig datagenerator. Node.js (JavaScript-kjøretid) bekrefter at den er egnet for sensitive data.

Sammenligning med vanlig RNG

  • Vanlig RNG (f.eks. Mersenne Twister) er rask og egnet for statistikk og spill, men ikke motstandsdyktig mot gjenfinning av frø.
  • CSPRNG bruker ekstra kryptografiske primitive (hash, blokk-krypter) for å sikre at utdata ikke kan skilles fra ekte tilfeldighet selv om angriperen kjenner deler av utdata. NIST SP 800-90A (standard) beskriver mekanismene.
Fallgruven

Mange utviklere antar at Math.random() er trygg nok for alt. For en angriper med innsikt i JavaScript-motoren er den forutsigbar. MDN Web Docs (nettleserstandard) anbefaler Crypto-API-et for alt som har med sikkerhet å gjøre.

Implikasjonen: hvis du genererer hemmeligheter som passord eller sesjonstokens, må du alltid bruke en CSPRNG. For alt annet er vanlig RNG tilstrekkelig.

Hvordan kode en tilfeldig tall-generator selv?

Python-eksempel med random-modul

import random
# Generer et tilfeldig heltall mellom 1 og 100
tilfeldig_tall = random.randint(1, 100)
print(tilfeldig_tall)
# Generer 5 unike tall fra 1 til 50
unik_liste = random.sample(range(1, 51), 5)
print(unik_liste)

Python random-dokumentasjon (standardbibliotek) viser flere eksempler. Denne koden er rask og enkel, men ikke kryptografisk sikker.

  1. Importer random-modulen: import random
  2. Bruk random.randint(1, 100) for å få ett tilfeldig heltall.
  3. Bruk random.sample(range(1, 51), 5) for flere unike tall.

Implementering av enkel algoritme (lineær kongruensgenerator)

def lcg(modulus, a, c, seed):
    return (a * seed + c) % modulus

En lineær kongruensgenerator er en av de enkleste pseudo-tilfeldige algoritmene. Wikipedia (lineær kongruensgenerator) beskriver hvordan parametere velges for å maksimere periode og kvalitet.

For å lage en kryptografisk sikker generator må du derimot bruke ferdige biblioteker som secrets i Python eller node:crypto i Node.js – det er for risikabelt å konstruere en CSPRNG selv uten kryptografisk ekspertise.

Hva er den beste algoritmen for tilfeldige tall?

Mersenne Twister

  • Mersenne Twister har en enorm periode (2^19937-1) og består de fleste statistiske tester. Wikipedia (Mersenne Twister) kaller den en av de mest utbredte pseudo-tilfeldige generatorene.
  • Den er hurtig og enkel å implementere, men ikke kryptografisk sikker.

Når velge CSPRNG

  • For sensitiv bruk: CSPRNG basert på NIST SP 800-90A eller tilsvarende. Node.js (JavaScript-kjøretid) tilbyr randomBytes som en CSPRNG.
  • Python secrets-modulen er et godt eksempel på en CSPRNG som er enkel å bruke riktig. Python secrets (sikkerhetsmodul) anbefales fremfor random for sikkerhetskritiske oppgaver.
Avveiningen

Mersenne Twister vinner på hastighet og statistisk kvalitet; CSPRNG vinner på sikkerhet. For 90 % av hverdagsbruk – spill, simuleringer, læring – er Mersenne Twister mer enn god nok.

Valget av algoritme bør alltid avhenge av hva tallene skal brukes til. En kryptografisk sikker generator er tungvint for en terningkast-simulator, mens en vanlig RNG er livsfarlig for passordgenerering.

Bekreftede fakta og usikkerheter

Bekreftede fakta

  • CSPRNG brukes for kryptografiske formål (Python docs)

Hva som er uklart

  • Hvorvidt en gitt algoritme er fullstendig tilfeldig i alle tilfeller (Wikipedia)
  • Om en ubekreftet CSPRNG-implementering er sikker nok uten uavhengig sertifisering
  • Mersenne Twister er en standard pseudo-tilfeldig generator (Wikipedia)

Hvordan bruke en tilfeldig tall-generator til moro?

Spill og lotterier

  • En enkel terningkast-simulator kan lages med random.randint(1, 6) i Python. Python random (standardbibliotek) gjør det enkelt.
  • Lotteri-trekning uten tilbakelegging: random.sample(pool, n).

Læringseksperimenter

  • Test statistisk kvalitet: generer 1000 tall og sjekk fordeling – den bør være jevn.
  • Sammenlign hastigheten til Mersenne Twister med en CSPRNG – Node.js (JavaScript-kjøretid) sin randomBytes er noe tregere, men sikrere.

Det er nettopp ved å leke med tilfeldige tall at man får en intuisjon for hvorfor valg av generator betyr noe – og hvorfor en “tilfeldig” terning kanskje ikke er så tilfeldig som du tror.

Sitater fra kilder

“En tilfeldig tall-generator er en algoritme som produserer en sekvens av tall som mangler et hvilket som helst mønster.”

– Wikipedia (Random number generation)

“Vi bruker atmosfærisk støy for å skape ekte tilfeldige tall som ikke kan reproduseres.”

RANDOM.ORG (spesialist på ekte tilfeldighet)

“Secrets-modulen bør brukes for alle sikkerhetskritiske tilfeldige tall i Python.”

– Python Software Foundation (offisiell dokumentasjon)

“Node.js randomBytes() genererer kryptografisk sterk pseudotilfeldig data egnet for kryptering.”

– Node.js (JavaScript-kjøretid)

Samlet sett bekrefter kildene at skillet mellom pseudo-tilfeldig og ekte tilfeldig er avgjørende for bruksområdet.

Hva du bør sitte igjen med

For deg som utvikler eller bare nysgjerrig: tilfeldige tall fra datamaskinen er nesten alltid pseudo-tilfeldige – og det er helt greit så lenge du ikke jobber med sikkerhet. Når du derimot skal lage passord, kryptere data eller generere sesjonstokens, finnes det ingen snarvei: du må bruke en CSPRNG. For norske utviklere og hobbybrukere er valget enkelt: Python secrets eller Node.js crypto gir deg den sikkerheten du trenger, mens random-biblioteket er perfekt for alt annet. Velger du feil, risikerer du at noen kan forutsi dine “tilfeldige” tall – og det er en risiko du ikke trenger å ta.

Ofte stilte spørsmål

Er tilfeldige tall fra en datamaskin alltid like tilfeldige?

Nei, de fleste er pseudo-tilfeldige – de ser tilfeldige ut, men er generert av en deterministisk algoritme. Ekte tilfeldighet krever en fysisk kilde som atmosfærisk støy. Wikipedia forklarer forskjellen.

Hvorfor trenger jeg en kryptografisk sikker generator?

For å forhindre at en angriper kan forutsi tallene – viktig for passord, nøkler og kryptering. Python secrets er laget for dette.

Kan jeg stole på nettbaserte generatorer?

De fleste nettverktøy bruker Math.random() i nettleseren, som ikke er kryptografisk sikker. For uformell bruk går det fint, men ikke for sikkerhetskritiske formål. MDN anbefaler Crypto-API-et.

Hva er forskjellen på random.randint og random.choice?

randint gir et tilfeldig heltall i et intervall, mens choice trekker et element fra en liste. Begge finnes i Python random-modul.

Hvordan generere tilfeldige tall uten repetisjon?

Bruk random.sample i Python eller implementer trekning uten tilbakelegging. Python random har sample-metoden.

Hvor mange tall kan jeg generere på én gang?

I teorien ubegrenset, men praktiske begrensninger ligger i minne og hastighet. Node.js randomBytes kan generere opptil 2^31 bytes per kall. Node.js dokumenterer grenser.

Hva er den beste måten å lage en tilfeldig tall-generator i Python?

For sikkerhet: bruk secrets-modulen. For generell bruk: random-modulen. Begge er enkle og veldokumenterte. Python secrets og random.

Relatert lesning



Mats Ole Larsen Berg

Om skribenten

Mats Ole Larsen Berg

Redaksjonen kombinerer raske oppdateringer med tydelige forklaringer.