Come si può rilevare che un generatore di numeri non è realmente casuale?


20

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?


1
Questo post può aiutarti.
Anton

6
A rischio di sembrare pedanti, non è davvero possibile dire con certezza che una determinata fonte non è casuale, se tutto ciò che fai è esaminare i suoi risultati. Puoi lanciare una moneta giusta volte di fila e ottenere teste ogni volta, e la tua possibilità di ottenere la coda sul lancio di 10 100 + 1 è ancora del 50%. Esaminando la fonte, di solito possiamo identificare cose non casuali (ad es. Generatori di numeri pseudocasuali ... potremmo prevedere la sequenza dal seme e dall'algoritmo). Molte fonti apparenti di casualità potrebbero non essere abbastanza capite da prevedere in modo affidabile. Questo è filosofico, però. 1010010100+1
Patrick87

@ Patrick87 Se con "certezza" intendi matematicamente, è vero. Esistono tuttavia test statistici che possono dare significato arbitrario (purché i dati siano "buoni").
Raffaello

@ Patrick87 A rischio di sembrare banale ... dici "Puoi lanciare una moneta giusta volte di fila e ottenere teste ogni volta" ... no, non posso. Qualsiasi modello che mi permette di vedere anche 10 3 teste di fila e ancora credo che sia una moneta giusta non cattura molto bene la realtà. Questo è davvero filosofico, però. ;-)10100103
Don Hatch,

Risposte:


15

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?

1n

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.


7
Questa è una risposta buona (ma incompleta) in generale, ma un paio di punti sono sbagliati. "La vera casualità è impossibile per i computer, poiché tutto ciò che fanno è deterministico." Non è sempre vero, alcuni processori includono un RNG hardware. I computer possono anche reagire a input esterni che possono essere casuali. "... per la crittografia, quindi non ci interessa davvero quanto siano" casuali "in termini di distribuzione": in realtà a volte una distribuzione uniforme è importante nella crittografia, ad esempio IV per CBC e il parametro k in DSA.
Gilles 'SO- smetti di essere malvagio' il

Ha scritto "Senza un'aggiunta esterna, tutto ciò che fa un computer è deterministico". L'aggiunta esterna è un riferimento a dispositivi come RNG come hai detto. Senza queste aggiunte, le nostre capacità computazionali sono uguali a quelle di una TM per la quale è impossibile la vera casualità.
Kent Munthe Caspersen,

Se ricordo bene l'ho aggiunto dopo il commento di Gilles.
SamM,

4

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 ....


3

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.


0

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.


"I PRNG non banali sono costruiti in modo tale che i loro algoritmi non possano essere rilevati (derivati)" - Non credo sia giusto. In effetti, la tua frase successiva la contraddice. Vuoi modificare la tua risposta per risolvere questo problema?
DW

potrebbe essere concretizzato più precisamente ma non seguendo, qual è la tua obiezione specifica? il punto è che l'algoritmo che sta generando la sequenza non può essere determinato solo dalla sequenza di dati da sola, tranne che per forza bruta, se l'algoritmo è sicuro e è improbabile che la forza bruta riesca in quel caso.
vzn

1
La mia obiezione specifica è che la frase suona male a me: sembra che tu stia dicendo che i PRNG sono progettati in modo tale che qualcuno osservando il proprio output non possa inferire quale fosse l'algoritmo, ma non è così che funzionano le cose nella vita reale. La maggior parte dei PRNG non sono costruiti per impedire a qualcuno di apprendere l'algoritmo; in genere, l'algoritmo è pubblico. Forse vuoi dire che i PRNG sono costruiti in modo tale che il loro output non possa essere distinto dai bit true-random?
DW

1
"l'algoritmo che sta generando la sequenza non può essere determinato solo dalla sequenza di dati da solo, tranne che per forza bruta, se l'algoritmo è sicuro" - Neanche questo è corretto. L' algoritmo è in genere pubblico. È solo il seme che non è pubblico ed è solo il seme che dovrebbe essere difficile da derivare dagli output.
DW

-1

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:

  • i numeri prodotti devono seguire una distribuzione uniforme (da questa distribuzione è possibile ottenere qualsiasi altra distribuzione);
  • i numeri prodotti devono essere statiscalmente indipendenti;
  • la sequenza è riproducibile (questo punto è imposto a causa di quella proprietà dell'hardware di un computer classico, ed è per questo che vengono chiamati "numeri pseudo-casuali");
  • il periodo della sequenza deve essere abbastanza grande;
  • la generazione dei numeri deve essere veloce.

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 /


Questo in realtà non rispondere alla domanda. Spieghi come generare numeri casuali, non per rilevare se un determinato RNG è casuale. Anche allora le tue spiegazioni sono in qualche modo carenti, le congruenze lineari non sono quasi “una delle migliori”. RNG hardware esistono ora, non è necessario il calcolo quantistico; c'è una buona possibilità che tu ne abbia uno nel tuo PC, uno nel tuo telefono e anche uno nella tua carta di credito.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.