Cos'è Pseudo-casuale?

I numeri pseudocasuali sono generati dai computer. Non sono veramente casuali, perché quando un computer funziona correttamente, non fa nulla di casuale. I computer sono dispositivi deterministici: il comportamento di un computer è del tutto prevedibile, in base alla progettazione. Quindi, per creare qualcosa di imprevedibile, i computer usano algoritmi matematici per produrre numeri "abbastanza casuali".

I numeri pseudocasuali sono essenziali per molte applicazioni informatiche, come i giochi e la sicurezza. Nei giochi, i numeri casuali forniscono elementi imprevedibili a cui il giocatore può rispondere, come schivare un proiettile a caso o pescare una carta dalla cima di un mazzo.

Nella sicurezza del computer, la pseudo-casualità è importante negli algoritmi di crittografia, che creano codici che non devono essere previsti o indovinati.

Cos'è un PRNG?

Un generatore di numeri pseudo-casuali, o PRNG, è un qualsiasi programma o funzione che usa la matematica per simulare la casualità. Può anche essere chiamato DRNG (generatore di numeri casuali digitali) o DRBG (generatore di bit casuali deterministici).

A volte la matematica può essere complessa, ma in generale, l'utilizzo di un PRNG richiede solo due passaggi:

  1. Fornire al PRNG un seme arbitrario.
  2. Chiedi il prossimo numero casuale.

Il valore seme è un "punto di partenza" per la creazione di numeri casuali. Il valore viene utilizzato quando si calcolano i numeri. Se il valore seme cambia, anche i numeri generati cambiano e un singolo valore seme produrrà sempre gli stessi numeri. Per questo motivo, i numeri non sono realmente casuali, poiché la casualità vera non potrebbe mai essere ricreata.

L'ora corrente viene spesso utilizzata come valore seme unico. Ad esempio, se è il 5 marzo 2018, alle 17:03 e alle 7.01324 secondi UTC, ciò può essere espresso come un numero intero. Quel tempo preciso non si ripeterà più, quindi un PRNG con quel seme dovrebbe produrre un insieme unico di numeri casuali.

Nota: essere in grado di riprodurre una sequenza generata a caso può essere utile. Nelle applicazioni accademiche è possibile generare una sequenza massiccia di valori casuali per una simulazione, quindi riprodurli esattamente per un'analisi più dettagliata successiva. Come altro esempio, nei giochi per computer, se un giocatore carica una partita salvata, qualsiasi evento "casuale" può essere lo stesso come se il gioco non si fermasse mai. In questo modo, il giocatore non può ricaricare ripetutamente la stessa partita per cercare di migliorare la fortuna.

Come generare un numero pseudo-casuale

Di seguito sono riportati alcuni modi per creare un numero pseudo-casuale in programmi e linguaggi di programmazione comuni.

Prompt dei comandi di Windows

Al prompt dei comandi di Windows o in un file batch, la variabile di ambiente speciale % RANDOM% produce un numero pseudo-casuale compreso tra 0 e 32767, inizializzato con il momento in cui è stato lanciato il prompt dei comandi.

 echo "So% RANDOM%!" 
 "Quindi 27525!" 

Per creare un file batch che genera un numero casuale compreso tra 1 e 100:

 copia con sorandom.bat echo off set / a myrand =% RANDOM% * 100/32768 + 1 echo Il numero a cui stavo pensando era% myrand%. l'hai fatto giusto? 

Premere Ctrl + Z e Invio per salvare il file batch. Quindi, esegui il file:

 così casuale 
 Il numero che stavo pensando era 91. Hai capito bene? 

Windows PowerShell

Il cmdlet Get-Random genera un numero casuale compreso tra 0 e 2.147.483.647 (il valore massimo di un numero intero a 32 bit senza segno).

 Get-Random 
 1333190525 

Il cmdlet accetta un numero di opzioni, ad esempio un valore minimo e massimo. I valori sono arrotondati per generare un numero compreso tra 1 e 100, impostare il massimo su 101:

 Get-Random -Minimum 1 -Maximum 101 
 99 

Microsoft Excel

In un foglio di calcolo di Excel, la formula = RAND () genererà un numero casuale compreso tra 0 e 1. Ad esempio, se si evidenzia una cella e si entra = RAND (), la cella conterrà un numero che cambierà ogni volta che il foglio viene visualizzato -calcolato.

Questo metodo funziona anche con altre applicazioni per fogli di calcolo, tra cui LibreOffice Calc e Google Sheets.

Nei linguaggi di programmazione

La maggior parte dei linguaggi di programmazione ha le proprie funzioni PRNG. Ecco alcuni esempi comuni:

C

Nel linguaggio di programmazione C, le funzioni PRNG sono definite nella libreria standard, stdlib . Il modo comune di generare il generatore casuale è con la funzione time (), dichiarata in time.h. Il numero generato è compreso tra 0 e la costante RAND_MAX, un numero intero specifico del sistema garantito almeno 32767.

 #include #include #include void main () {srand (time (NULL)); / * seed il generatore * / int rand1 = rand (); / * un intero pseudocasuale compreso tra 0 e RAND_MAX * / printf ("Numero casuale compreso tra 0 e% d:% d \ n", RAND_MAX, (int) rand1); / * O, all'interno di un intervallo specifico: * / int min = 0; int max = 100; float rand2 = (float) rand () * max / RAND_MAX + 1; int round = (int) rand2; printf ("Numero casuale compreso tra% d e% d:% d (% f) \ n", min, max, round, rand2); ritorno; } 

Produzione:

 Numero casuale compreso tra 0 e 2147483647: 1789080047 Numero casuale compreso tra 0 e 100: 74 (74, 369179) 

C ++

In C ++:

 #include #include #include int main () {srand (time (NULL)); std :: cout << "Numero casuale compreso tra 0 e" << RAND_MAX << ":" << rand () << "\ n" << "Numero casuale compreso tra 1 e 100:" << (rand ()% 100) + 1 << std :: endl; ritorno 0; } 

Produzione:

 Numero casuale compreso tra 0 e 2147483647: 126569208 Numero casuale compreso tra 1 e 100: 9 

Python 3

Il modulo random in Python offre una varietà di funzioni per generare numeri casuali. In questo esempio, utilizziamo tre diversi metodi per trovare un numero intero casuale in un intervallo.

 importare random da datetime import datatime random.seed (datetime.now ()) print ("Numero casuale nell'intervallo [0, 1):", random.random ()) # All'interno di un intervallo. Questi fanno tutti la stessa cosa: print ("Numero casuale compreso tra 1 e 100:", round (random.random () * 100) + 1) print ("Numero casuale compreso tra 1 e 100:", random.randrange (1, 101)) print ("Numero casuale compreso tra 1 e 100:", random.randint (1, 100)) 

Produzione:

 Numero casuale nel range [0, 1): 0.05137418896158319 Numero casuale compreso tra 1 e 100: 27 Numero casuale compreso tra 1 e 100: 80 Numero casuale compreso tra 1 e 100: 80 

Perl 5

In Perl:

 srand (time); # cambia una volta al secondo print "Numero casuale nell'intervallo [0, 1):", rand (), "\ n"; print "Numero casuale nell'intervallo [1, 100]:", int (rand (101)), "\ n"; 

Produzione:

 Numero casuale nell'intervallo [0, 1): 0, 691379946963028 Numero casuale nell'intervallo [0, 100]: 82 

JavaScript

 console.log ("Numero casuale nell'intervallo [0, 1):" + Math.random ()); console.log ("Numero casuale nell'intervallo [1, 100]:" + Math.floor (Math.random () * 101)); 

Visualizza l'output nella console JavaScript del tuo browser Web (ad esempio, in Firefox premi Ctrl + Maiusc + K ):

 Numero casuale nel campo [0, 1): 0, 305008216755414 Numero casuale nel campo [1, 100]: 8 

Nota: non è possibile inizializzare la funzione Math.random () in JavaScript. Se hai bisogno di un robusto PRNG in JavaScript, controlla numeri casuali migliori per JavaScript su GitHub.

Esempio PRNG: widget JavaScript

Usando il widget sottostante, puoi seminare un PRNG e usarlo per generare numeri casuali.

Ogni volta che generi un numero casuale dal seme specificato, il suo offset aumenta di 1. Il primo numero generato dal seme ha offset zero, il secondo ha offset 1, ecc. Il generatore produce sempre lo stesso numero per un dato seme e offset .

Inserisci tutto ciò che vuoi nel campo per creare un seme unico.

Usa il pulsante Genera per ottenere il prossimo numero casuale usando quel seme e incrementa l'offset.

Utilizzare il pulsante Ripristina per ripristinare l'offset su zero.

numero generato da seme :

Reimposta offset seme (attualmente 0 )

Questo widget utilizza gli script PRNG open source di Johannes Baagøe, Alea.js e Mash.js.

Sicurezza del computer, programmazione, termini del software