Hva er Pseudo-tilfeldig?

Pseudo-tilfeldige tall genereres av datamaskiner. De er ikke helt tilfeldige, fordi når en datamaskin fungerer som den skal, er det ikke tilfeldig. Datamaskiner er deterministiske enheter - En dators adferd er helt forutsigbar, med design. For å lage noe uforutsigbart bruker datamaskiner matematiske algoritmer til å produsere tall som er "tilfeldig nok".

Pseudo-tilfeldige tall er avgjørende for mange dataprogrammer, for eksempel spill og sikkerhet. I spill gir tilfeldige tall uforutsigbare elementer spilleren kan svare på, for eksempel å dodge en tilfeldig kule eller tegne et kort fra toppen av et kortstokk.

I datasikkerhet er pseudo-tilfeldighet viktig i krypteringsalgoritmer, som lager koder som ikke må forutses eller gjettes.

Hva er en PRNG?

En pseudo-tilfeldig talgenerator, eller PRNG, er et hvilket som helst program, eller funksjon, som bruker matematikk til å simulere tilfeldighet. Det kan også kalles en DRNG (digital random number generator), eller DRBG (deterministisk random bit generator).

Matematikken kan noen ganger være kompleks, men generelt krever det bare to trinn: Bruk av en PRNG:

  1. Gi PRNG et vilkårlig frø.
  2. Be om neste tilfeldige nummer.

Frøverdien er et "utgangspunkt" for å lage tilfeldige tall. Verdien brukes når du beregner tallene. Hvis frøverdien endres, endres også de genererte tallene, og en enkelt frøverdi vil alltid produsere de samme tallene. Av denne grunn er tallene ikke egentlig tilfeldige, fordi ekte tilfeldighet aldri kan gjenopprettes.

Nåværende tid brukes ofte som en unik frøverdi. For eksempel, hvis det er 5. mars 2018 klokken 17:03 og 7.01324 sekunder UTC, kan det uttrykkes som et heltall. Den presise tiden vil aldri skje igjen, så en PRNG med det frøet skal produsere et unikt sett av tilfeldige tall.

Merk: Å kunne reproducere en tilfeldig generert sekvens kan være nyttig. I akademiske applikasjoner kan en massiv sekvens av tilfeldige verdier genereres for en simulering, og deretter gjengis nøyaktig for mer detaljert analyse senere. Som et annet eksempel, i dataspill, hvis en spiller laster et lagret spill, kan noen "tilfeldige" hendelser være det samme som om spillet aldri stoppet. På den måten kan spilleren ikke gjenta det samme spillet flere ganger for å prøve bedre lykke.

Hvordan generere pseudo-tilfeldig tall

Følgende er noen måter du kan lage et pseudo-tilfeldig nummer i vanlige programmer og programmeringsspråk.

Windows Command Prompt

Ved kommandoprompten til Windows, eller i en batchfil, genererer den spesielle miljøvariabelen % RANDOM% et pseudo-tilfeldig tall mellom 0 og 32767, frøet med tiden kommandoprompten startet.

 ekko "Så% RANDOM%!" 
 "Så 27525!" 

Å opprette en batchfil som genererer et tilfeldig tall mellom 1 og 100:

 kopi con sorandom.bat echo av set / a myrand =% RANDOM% * 100/32768 + 1 ekko Antallet jeg tenkte på var% myrand%. Fikk du det riktig? 

Trykk Ctrl + Z og Enter for å lagre batchfilen. Deretter utfør filen:

 så tilfeldig 
 Tallet jeg tenkte på var 91. Fikk du det riktig? 

Windows PowerShell

Tilfeldig cmdlet genererer et tilfeldig tall mellom 0 og 2.147.483.647 (maksimumverdien av et usignert 32-biters heltall).

 Get-Random 
 1333190525 

Cmdlet tar en rekke alternativer, for eksempel en minimums- og maksimumsverdi. Verdiene er avrundet, slik at du genererer et tall mellom 1 og 100, sett maksimum til 101:

 Tilfeldig-Minimum 1-Maksimal 101 
 99 

Microsoft Excel

I et Excel-regneark vil formelen = RAND () generere et tilfeldig tall mellom 0 og 1. Hvis du for eksempel markerer en celle og skriver inn = RAND (), inneholder cellen et nummer som endres når arket er igjen -regnet ut.

Denne metoden fungerer også i andre regnearkprogrammer, inkludert LibreOffice Calc og Google Sheets.

I programmeringsspråk

De fleste programmeringsspråk har sine egne PRNG-funksjoner. Her er noen vanlige eksempler:

C

I C-programmeringsspråket defineres PRNG-funksjonene i standardbiblioteket, stdlib . Den vanlige måten å frø ut tilfeldiggeneratoren er med tiden () -funksjonen, erklært i time.h. Det genererte tallet faller mellom 0 og den konstante RAND_MAX, et systemspesifikt heltall garantert å være minst 32767.

 #include #include #include void main () {srand (tid (NULL)); / * frø generator * / int rand1 = rand (); / * et pseudorandom heltall mellom 0 og RAND_MAX * / printf ("Tilfeldig tall mellom 0 og% d:% d \ n", RAND_MAX, (int) rand1); / * Eller innenfor et bestemt område: * / int min = 0; int max = 100; float rand2 = (float) rand () * max / RAND_MAX + 1; int runde = (int) rand2; printf ("Tilfeldig tall mellom% d og% d:% d (% f) \ n", min, maks, rund, rand2); komme tilbake; } 

Produksjon:

 Tilfeldig tall mellom 0 og 2147483647: 1789080047 Tilfeldig tall mellom 0 og 100: 74 (74.369179) 

C ++

I C ++:

 #include #include #include int main () {srand (tid (NULL)); std :: cout << "Tilfeldig tall mellom 0 og" << RAND_MAX << ":" << rand () << "\ n" << "Tilfeldig tall mellom 1 og 100:" << (rand ()% 100) + 1 << std :: endl; returner 0; } 

Produksjon:

 Tilfeldig tall mellom 0 og 2147483647: 126569208 Tilfeldig tall mellom 1 og 100: 9 

Python 3

Den tilfeldige modulen i Python tilbyr en rekke funksjoner for å generere tilfeldige tall. I dette eksemplet bruker vi tre forskjellige metoder for å finne et tilfeldig heltall i et område.

 Import tilfeldig fra datetime import datetime random.seed (datetime.now ()) print ("Tilfeldig nummer i rekkevidde [0, 1):", random.random ()) # Innenfor en rekkevidde. Alt dette gjør det samme: Skriv ut ("Tilfeldig tall mellom 1 og 100:", runde (random.random () * 100) + 1) print ("Tilfeldig tall mellom 1 og 100:", random.randrange (1, 101)) skriv ut ("Tilfeldig tall mellom 1 og 100:", random.randint (1, 100)) 

Produksjon:

 Tilfeldig tall i rekkevidde [0, 1]: 0, 05137418896158319 Tilfeldig tall mellom 1 og 100: 27 Tilfeldig tall mellom 1 og 100: 80 Tilfeldig tall mellom 1 og 100: 80 

Perl 5

I Perl:

 srand (tid); # endres en gang per sekund utskrift "Tilfeldig tall i rekkevidde [0, 1):", rand (), "\ n"; skriv ut "Tilfeldig nummer i området [1, 100]:", int (rand (101)), "\ n"; 

Produksjon:

 Tilfeldig tall i rekkevidde [0, 1): 0, 691379946963028 Tilfeldig tall i rekkevidde [0, 100]: 82 

Javascript

 console.log ("Tilfeldig tall i rekkevidde [0, 1):" + Math.random ()); console.log ("Tilfeldig tall i rekkevidde [1.100]:" + Math.floor (Math.random () * 101)); 

Se utgangen i nettleserens JavaScript-konsoll (for eksempel i Firefox-trykk Ctrl + Shift + K ):

 Tilfeldig tall i rekkevidde [0, 1]: 0, 305008216755414 Tilfeldig tall i rekkevidde [1.100]: 8 

Merk: Det er ikke mulig å frøse Math.random () -funksjonen i JavaScript. Hvis du trenger en robust PRNG i JavaScript, sjekk ut bedre tilfeldige tall for JavaScript på GitHub.

Eksempel PRNG: JavaScript-widget

Ved hjelp av widgeten nedenfor kan du frøke en PRNG og bruke den til å generere tilfeldige tall.

Hver gang du genererer et tilfeldig tall fra ditt givne frø, øker forskyvningen med 1. Det første tallet som genereres fra frøet har kompensert null, den andre har kompensasjon 1, etc. Generatoren produserer alltid det samme tallet for et gitt frø og offset .

Skriv inn alt du vil ha i feltet for å lage et unikt frø.

Bruk Generate-knappen for å få det neste tilfeldige tallet ved hjelp av det frøet, og øk kompensasjonen.

Bruk Reset-knappen for å tilbakestille forskyvningen til null.

nummer generert fra frø :

Tilbakestill frøforskyvning (for tiden 0 )

Denne widgeten bruker Johannes Baagøes open source-PRNG-skript, Alea.js og Mash.js.

Datasikkerhet, Programmering, Programvarebetingelser