Vad är Pseudo-slumpmässigt?

Pseudo-slumpmässiga tal genereras av datorer. De är inte riktigt slumpmässiga, för när en dator fungerar korrekt är ingenting det som är slumpmässigt. Datorer är deterministiska enheter - En dators beteende är helt förutsägbar, genom design. Så för att skapa något oförutsägbart använder datorer matematiska algoritmer för att producera siffror som är "slumpmässiga nog".

Pseudo-slumpmässiga siffror är viktiga för många datortillämpningar, till exempel spel och säkerhet. I spel ger slumpmässiga siffror oförutsägbara element som spelaren kan svara på, till exempel dodging en slumpmässig kula eller ritning av ett kort från toppen av ett däck.

I datasäkerhet är pseudo-slumpmässighet viktig i krypteringsalgoritmer, vilket skapar koder som inte får förutsägas eller gissas.

Vad är en PRNG?

En pseudo-slumpmässig talgenerator eller PRNG är något program eller en funktion som använder matematik för att simulera slumpmässighet. Det kan också kallas en DRNG (digital slumptalsgenerator) eller DRBG (deterministisk slumpgenerator).

Matematiken kan ibland vara komplex, men i allmänhet kräver en PRNG endast två steg:

  1. Ge PRNG med ett godtyckligt frö.
  2. Be om nästa slumptal.

Frövärdet är en "utgångspunkt" för att skapa slumptal. Värdet används vid beräkning av numren. Om frövärdet ändras ändras också de genererade siffrorna, och ett enda frövärde kommer alltid att producera samma antal. Av denna anledning är siffrorna inte riktigt slumpmässiga, eftersom sann slumpmässighet aldrig kunde skapas om.

Den aktuella tiden används ofta som ett unikt frövärde. Till exempel, om det är 5 mars 2018, klockan 17:03 och 7, 01324 sekunder UTC, kan det uttryckas som ett heltal. Den exakta tiden kommer aldrig att uppstå igen, så en PRNG med det fröet ska producera en unik uppsättning slumptal.

Obs! Att kunna reproducera en slumpmässigt genererad sekvens kan vara användbar. I akademiska tillämpningar kan en massiv sekvens av slumpmässiga värden genereras för en simulering, sedan reproduceras exakt för mer detaljerad analys senare. Som ett annat exempel, i datorspel, om en spelare laddar ett sparat spel, kan "slumpmässiga" händelser vara desamma som om spelet aldrig slutade. På så sätt kan spelaren inte ladda om samma spel upprepade gånger för att försöka lyckas.

Hur genererar pseudoslumpmässigt nummer

Nedan följer några sätt att skapa ett pseudo-slumpmässigt nummer i vanliga program och programmeringsspråk.

Windows Command Prompt

I Windows-kommandotolken eller i en batchfil skapar den speciella miljövariabeln % RANDOM% ett pseudo-slumpmässigt tal mellan 0 och 32767, utsädat med den tid kommandotolken startade.

 echo "Så% RANDOM%!" 
 "Så 27525!" 

Att skapa en batchfil som genererar ett slumptal mellan 1 och 100:

 kopiera con sorandom.bat echo av set / a myrand =% RANDOM% * 100/32768 + 1 eko Antalet jag tänkte på var% myrand%. Fick du det rätt? 

Tryck Ctrl + Z och Enter för att spara batchfilen. Kör sedan filen:

 så slumpmässig 
 Antalet jag tänkte på var 91. Fick du det rätt? 

Windows PowerShell

Den slumpmässiga cmdlet genererar ett slumptal mellan 0 och 2.147.483.647 (det maximala värdet av ett osignerat 32-bitars heltal).

 Get-Random 
 1333190525 

Cmdlet tar ett antal alternativ, till exempel ett minimum och maximalt värde. Värdena avrundas, så att generera ett tal mellan 1 och 100, ställa in maximalt till 101:

 Slumpmässig-Minsta 1-Maximal 101 
 99 

Microsoft excel

I ett Excel-kalkylblad kommer formeln = RAND () att generera ett slumptal mellan 0 och 1. Om du markerar en cell och anger = RAND (), innehåller cellen ett nummer som kommer att ändras när arket är igen -beräknad.

Den här metoden fungerar också i andra kalkylarksapplikationer, inklusive LibreOffice Calc och Google Sheets.

I programmeringsspråk

De flesta programmeringsspråk har egna PRNG-funktioner. Här är några vanliga exempel:

C

I C programmeringsspråket definieras PRNG-funktionerna i standardbiblioteket, stdlib . Det vanliga sättet att utsätta slumpgeneratorn är med funktionen time (), deklarerad i time.h. Det genererade numret faller mellan 0 och den konstanta RAND_MAX, ett systemspecifik heltal garanterat att vara minst 32767.

 #include #include #include void main () {srand (tid (NULL)); / * frö generatoren * / int rand1 = rand (); / * ett pseudorandom heltal mellan 0 och RAND_MAX * / printf ("Slumpmässigt tal mellan 0 och% d:% d \ n", RAND_MAX, (int) rand1); / * Eller inom ett visst intervall: * / int min = 0; int max = 100; float rand2 = (float) rand () * max / RAND_MAX + 1; int runda = (int) rand2; printf ("Slumpmässigt tal mellan% d och% d:% d (% f) \ n", min, max, runda, rand2); lämna tillbaka; } 

Produktion:

 Slumpmässigt tal mellan 0 och 2147483647: 1789080047 Slumpmässigt tal mellan 0 och 100: 74 (74.369179) 

C ++

I C ++:

 #include #include #include int main () {srand (tid (NULL)); std :: cout << "Slumpmässigt tal mellan 0 och" << RAND_MAX << ":" << rand () << "\ n" << "Slumpmässigt tal mellan 1 och 100:" << (rand ()% 100) + 1 << std :: endl; returnera 0; } 

Produktion:

 Slumpmässigt tal mellan 0 och 2147483647: 126569208 Slumpmässigt tal mellan 1 och 100: 9 

Python 3

Den slumpmässiga modulen i Python erbjuder en mängd olika funktioner för att generera slumptal. I det här exemplet använder vi tre olika metoder för att hitta ett slumpmässigt heltal i ett intervall.

 Import slumpmässigt från datetime import datetime random.seed (datetime.now ()) print ("Slumpmässigt nummer inom intervallet [0, 1):", random.random ()) # Inom ett intervall. Dessa alla gör samma sak: Skriv ut ("Slumpmässigt tal mellan 1 och 100:", runt (random.random () * 100) + 1) print ("Slumpmässigt tal mellan 1 och 100:", random.randrange (1, 101)) skriv ut ("Slumpmässigt tal mellan 1 och 100:", slumpmässigt.randint (1, 100)) 

Produktion:

 Slumpmässigt antal inom intervallet [0, 1]: 0, 05137418896158319 Slumpmässigt tal mellan 1 och 100: 27 Slumpmässigt tal mellan 1 och 100: 80 Slumpmässigt tal mellan 1 och 100: 80 

Perl 5

I Perl:

 srand (tid); # ändras en gång per sekund utskrift "Slumpmässigt nummer inom intervallet [0, 1]:", rand (), "\ n"; skriv ut "Slumpmässigt nummer inom intervallet [1, 100]:", int (rand (101)), "\ n"; 

Produktion:

 Slumpmässigt antal inom intervallet [0, 1]: 0, 691379946963028 Slumpmässigt antal inom intervallet [0, 100]: 82 

JavaScript

 console.log ("Slumpmässigt nummer inom intervallet [0, 1]:" + Math.random ()); console.log ("Slumpmässigt nummer inom intervallet [1.100]:" + Math.floor (Math.random () * 101)); 

Visa utmatningen i din webbläsares JavaScript-konsol (till exempel i Firefox-press Ctrl + Shift + K ):

 Slumpmässigt antal inom intervallet [0, 1]: 0, 305008216755414 Slumpmässigt antal inom intervallet [1.100]: 8 

Obs! Det går inte att söka Math.random () -funktionen i JavaScript. Om du behöver en robust PRNG i JavaScript, kolla in bättre slumpmässiga nummer för JavaScript på GitHub.

Exempel PRNG: JavaScript-widget

Med hjälp av widgeten nedan kan du frösa en PRNG och använda den för att generera slumptal.

Varje gång du genererar ett slumptal från ditt givna utsäde, ökar dess förskjutning med 1. Det första talet som genereras från fröet har offset noll, den andra har offset 1 etc. Generatorn producerar alltid samma antal för ett givet frö och förskjutning .

Ange allt du vill ha i fältet för att skapa ett unikt frö.

Använd Generate-knappen för att få nästa slumptal med det fröet och öka förskjutningen.

Använd Reset-knappen för att återställa offset till noll.

tal som genereras av frö :

Återställ fröförskjutning (för närvarande 0 )

Denna widget använder Johannes Baagøes open source-PRNG-skript, Alea.js och Mash.js.

Datorsäkerhet, Programmering, Programmeringsvillkor