Ho sentito che la generazione di numeri casuali nei computer non è davvero casuale, ma non esiste un algoritmo efficiente per rilevarlo. Come può essere rilevato?
Ho sentito che la generazione di numeri casuali nei computer non è davvero casuale, ma non esiste un algoritmo efficiente per rilevarlo. Come può essere rilevato?
Risposte:
I computer sono davvero casuali:
La vera casualità è impossibile per le macchine di Turing in senso teorico e la maggior parte dei computer non è in grado di generare output realmente casuali. Pertanto, alcuni computer moderni includono hardware che consente al computer di accedere a una fonte esterna che si spera includa casualità. Un esempio di come ciò può essere realizzato è quello di tracciare piccole fluttuazioni di temperatura all'interno del computer. La casualità può essere ottenuta anche da una fonte esterna. Ma dal tono del tuo post non penso che le fonti esterne di casualità siano ciò che ti interessa.
Seeds:
Senza un'aggiunta esterna, tutto ciò che fa un computer è deterministico. Questo porta a un grosso problema: se chiami un programma di generazione di numeri casuali, ti darà lo stesso risultato ogni volta che gli dai lo stesso input. Chiaramente, abbiamo bisogno di un programma che emetta un numero casuale per cambiarne il comportamento ogni volta che viene eseguito (altrimenti continueremo a ottenere lo stesso numero "casuale", che non è particolarmente utile). Un'idea è quella di dare al programma un input, che cambia ogni volta che il programma viene eseguito, in modo che venga emesso un numero diverso. Chiamiamo questo input un "seme". Il generatore di numeri casuali deve prendere un seme, eseguire alcune operazioni e darci un numero casuale.
L'ora corrente del sistema è un classico esempio di seme. Ciò fornisce una lunga stringa con elevata entropia e se il tempo viene tenuto traccia in modo sufficientemente granulare (ovvero se l'orologio di sistema utilizza le ore il "tempo" è un seme piuttosto scadente), è improbabile che si dia da mangiare al numero pseudocasuale generatore lo stesso numero due volte.
Algoritmi che sono abbastanza casuali:
Ora abbiamo un algoritmo che almeno ha un modo per essere diverso ogni volta che viene eseguito. Gli diamo un seme e mentre l'algoritmo fornisce lo stesso numero quando richiesto con lo stesso seme, vogliamo che i numeri che genera siano casuali altrimenti. Questo si comporta come sopra: si prende in input e produce un output (si spera abbastanza diverso dall'input per essere "casuale").
Ora supponiamo che tu abbia inventato il tuo algoritmo per farlo, e affermi che i numeri che ti vengono in mente sono abbastanza simili a quelli casuali quando gli hai dato un sacco di semi diversi. Come potremmo testare quanto è buono?
Ora vogliamo un algoritmo che prenderà un seme, eseguirà alcune operazioni e produrrà un numero casuale. Nel migliore dei casi, l'algoritmo potrebbe semplicemente produrre il seme - non ci fornisce lo stesso numero ogni volta, e i semi casuali ci danno output casuali. Ma chiaramente non è quello che vogliamo. D'altra parte, un algoritmo può essere abbastanza complicato, come molti generatori pseudocasuali reali. Come possiamo dire quali algoritmi ci danno numeri "casuali" dai nostri semi non necessariamente casuali? Se non riusciamo a capirlo esattamente, come possiamo sapere quali sono i migliori?
Abbastanza casuale per imbrogliare un attaccante:
Ora a cosa POTETE fare riferimento sono i generatori pseudocasuali sicuri dal punto di vista crittografico. Penso che il modo migliore per spiegarlo sia nel contesto di cui sopra - qui, stiamo usando la nostra casualità per la crittografia, quindi quando progettiamo test ciò a cui teniamo davvero è che qualcuno non sarà in grado di rompere la nostra sicurezza predicendo quale numero casuale abbiamo scelto. Non conosco il tuo livello di familiarità con la crittografia, ma immagina che stiamo facendo un semplice cifrario sostitutivo --- ogni lettera viene sostituita con un'altra lettera. Vogliamo scegliere questi rimpiazzi in modo casuale, quindi sono difficili da indovinare per un attaccante. Ma se riesce a capire come funziona il mio generatore di numeri casuali, sarà in grado di risolvere l'intero codice! Pertanto, gli algoritmi crittografici richiedono generatori di numeri casuali che sono specificamente difficili da indovinare.
Per questo motivo, i CSPRG sono definiti in termini di risoluzione degli altri algoritmi (che è dove arriviamo finalmente alla tua domanda). In particolare, supponiamo che io abbia un CSPRG che chiamerò R. R è un CSPRG se e solo se non esiste un algoritmo fattibile in grado di indovinare quale bit verrà emesso successivamente. Questo è vero anche se conosci tutti i bit precedenti che ha prodotto!
Quindi diciamo che i primi cinque bit che il mio CSPRG ha prodotto sono 10100. Non conosci l'input che ho usato per il programma, ma hai accesso al codice che ho usato per scrivere il mio CSPRG. Quindi l'affermazione è che è impossibile per te scrivere un programma per decidere se l'output del prossimo bit sarà 101000 o 101001.
Quindi, per motivi di crittografia, a volte quanto bene fa un generatore di numeri pseudocasuali è definito in termini di quanto sia prevedibile per altri programmi. Si noti che ciò fornisce ancora gran parte dell'intuizione di "casualità", poiché (se si dice) se si sa che tutte le uscite casuali saranno dispari, non è né crittograficamente sicuro né passa un test di casualità di buon senso.
Recentemente ho trovato un bel post sulla casualità nel calcolo sul blog del MIT CSAIL Theory of Computation Group: puoi dire se un po 'è casuale?
Il post inizia con alcune idee estratte da un meraviglioso discorso di Avi Wigderson sul potere e sui limiti della casualità nel calcolo, esaminando la splendida area degli algoritmi randomizzati e la sorprendente connessione tra pseudocasualità e intrattabilità computazionale .
Quindi riassume alcuni risultati recenti sulla crittografia quantistica; in particolare il modo per testare efficacemente se l'output di un certo tipo di dispositivo è veramente casuale (protocolli di espansione della casualità).
Ad esempio, vedi il recente lavoro di Umesh Vazirani, Thomas Vidick, Certifiable Quantum Dice (O, espansione della casualità esponenziale verificabile)
Riassunto: introduciamo un protocollo attraverso il quale una coppia di dispositivi meccanici quantistici può essere utilizzata per generare n bit di vera casualità da un seme di O (log n) bit uniformi. I bit generati sono verificabili casualmente sulla base di un semplice test statistico che può essere eseguito dall'utente e sul presupposto che i dispositivi obbediscano al principio di non segnalazione. Nessun altro presupposto è posto sul funzionamento interno dei dispositivi ....
Supponendo che tu stia parlando di casualità statistica - la crittografia ha altri bisogni! - vi è tutta una serie di test di bontà di adattamento in grado di rilevare se una sequenza di numeri si adatta a una determinata distribuzione. Puoi usarli per verificare se un generatore di numeri casuali (pseudo) è valido (fino alla qualità del tuo test e al significato scelto).
Le suite di test Diehard combinano metodi diversi.
Questo è un argomento ampio / complesso in informatica che l'altra risposta di SamM affronta alcuni. La tua domanda specifica sembra essere se i computer hanno quelli che sono chiamati PRNG , cioè generatori di numeri pseudo casuali, come si può rilevare?
La risposta breve è che i PRNG non banali sono costruiti in modo tale che i loro algoritmi non possano essere rilevati (derivati). In generale, se il PRNG è ciò che viene chiamato "sicuro", anche se un utente malintenzionato conosce l'algoritmo utilizzato per generare la sequenza pseudocasuale, non può indovinare i parametri specifici utilizzati per generare la sequenza. In questo modo la pseudorandomness ha molti legami profondi con la crittografia e si può parlare di "rompere" un PRNG più o meno allo stesso modo in cui un algoritmo crittografico può essere "rotto". Esistono numerosi articoli di ricerca in quest'area, che è un'area attiva all'avanguardia della crittografia.
Per i PRNG "banali", ad esempio un generatore congruenziale lineare , se l'attaccante conosce l'algoritmo utilizzato per generarlo e non è generato con "bignum" , lo spazio di ricerca è "relativamente piccolo" e l'aggressore potrebbe anche teoricamente trovare i parametri usato dal particolare PRNG fondamentalmente dalla forza bruta e provando tutte le combinazioni.
I PRNG possono essere rotti in pratica (sempre a seconda della loro "sicurezza") in alcuni casi eseguendo una vasta serie di test statistici di casualità contro di essi. ad esempio questa è la logica del programma "Dieharder" (di Brown). C'è anche una suite NIST .
La difficoltà / durezza intrinseca della rottura dei PRNG non è ancora rigorosamente dimostrata teoricamente, ma è sostanzialmente associata a quelle che sono chiamate "botola" o "funzioni a senso unico" che possono essere calcolate in modo efficiente in una direzione ma che sono "difficili" da invertire (indietro) . Ci sono alcuni problemi aperti nella crittografia sulla durezza della casualità. Queste domande riguardano strettamente le separazioni delle classi di complessità, ad esempio la famosa domanda P =? NP.
Le domande sulla rottura dei PRNG riguardano anche la complessità di Kolmogorov , un campo che studia le macchine di Turing più piccole in grado di generare sequenze. la rottura del PRNG si riferisce anche alla ricerca del programma "più breve" per calcolare una sequenza pseudocasuale. E la complessità di Kolmogorov è indecidibile da calcolare in generale.
Come sottolinea Gilles in un commento, esistono RNG basati su hardware costruiti con processi elettronici fisici come quelli legati al rumore quantico. questi se progettati correttamente sono infrangibili.
In effetti tutto ciò che fa un computer classico è deterministico, nel senso che quando gli dai alcuni compiti li segue in modo deterministico. Pertanto, se si desidera avere un numero casuale, è possibile calcolarlo di conseguenza in base al tempo (in base al tempo di input dell'utente), ma se si desidera avere un set di numeri casuali, non è possibile utilizzare l'ora per i numeri successivi, poiché il i numeri non sarebbero più indipendenti.
Quello che la gente fa è usare generatori pseudo-casuali che hanno un seme, cioè un numero che viene usato per calcolare tutti i numeri del generatore di numeri pseudo-casuali (in alcuni casi più sofisticati di simulazione o altre attività, potrebbero essere necessari più semi , se è necessaria più di una serie di numeri casuali indipendenti). Il seme di solito è 0 o un numero specifico se si desidera risultati riproducibili, oppure l'ora in cui tu e altri risultati non riproducibili.
Il fatto che i generatori di numeri pseudo-casuali siano abbastanza buoni, risiede nel fatto che seguono "le caratteristiche di base di una generazione di numeri pseudo-casuali", al fine di essere calcolati in modo efficiente e comportarsi come numeri casuali reali:
Da ogni numero della sequenza di numeri pseudo-casuali viene calcolato un nuovo numero (di solito lavoriamo con numeri interi). Tuttavia c'è un periodo, n, in una sequenza di generatori di numeri pseudo-casuali pronti a lavorare in una base specifica con un numero finito di bit disponibili per esprimere i numeri (es. Binario). Se questo n non fosse abbastanza grande ci sarebbero seri problemi, ma non preoccuparti, gli informatici scelgono bene i semi e altri parametri dei generatori pseudo-casuali, per avere un buon n.
Ad esempio, un possibile generatore di numeri pseudo-casuali, con il metodo congruenziale lineare, che è uno dei più antichi e noti algoritmi di generatori di numeri pseudo-casuali, può essere definito di conseguenza:
ha quattro valori:
- x_0 ≥ 0
- a ≥ 0
- c ≥ 0
- m> x_0, dove:
x0 è il valore iniziale, a, c e m sono costanti in cui: m> a, m> c, e produce la sequenza con la fornula:
x_ {i + 1} = (a * x_i + c) MOD m
I valori per queste costanti devono essere scelti con cura. Una possibilità è:
x_ {i + 1} = (1664525 * x_i + 1013904223) MOD 2 ^ 32, rif. [1-2]
Esistono altri algoritmi più sofisticati per generare numeri casuali, che evitano alcuni dei problemi dei precedenti algoritmi, tra cui: [3]
- periodi più brevi del previsto per alcuni stati seme (tali stati seme possono essere definiti "deboli" in questo contesto);
- mancanza di uniformità di distribuzione per grandi quantità di numeri generati;
- correlazione di valori successivi;
- scarsa distribuzione dimensionale della sequenza di output;
- le distanze tra i punti in cui si verificano determinati valori sono distribuite in modo diverso da quelle in una distribuzione di sequenza casuale.
In futuro, i computer classici potrebbero essere uniti a sistemi quantistici che possono fornire numeri realmente casuali e consegnarli. [4]
riferimenti:
[1] http://it.wikipedia.org/wiki/linear_congruential_generator
[2] William H., et al. (1992). "Ricette numeriche in fortran 77: L'arte dell'informatica scientifica" (2a edizione). ISBN 0-521-43064-X.
[3] http://en.wikipedia.org/wiki/pseudorandom_number_generator
[4] http://www.technologyreview.com/view/418445/first-evidence-that-quantum-processes-generate-truly-random-numbers /