Perché è impossibile produrre numeri veramente casuali?


47

Stavo cercando di risolvere un problema di hobby che richiedeva la generazione di un milione di numeri casuali. Ma ho capito subito, sta diventando difficile renderli unici. Ho preso Algorithm Design Manual per leggere sulla generazione di numeri casuali.

Ha il paragrafo seguente che non sono in grado di comprendere.

Sfortunatamente, generare numeri casuali sembra molto più semplice di quanto non sia in realtà. In effetti, è fondamentalmente impossibile produrre numeri veramente casuali su qualsiasi dispositivo deterministico. Von Neumann [Neu63] lo ha detto meglio: "Chiunque consideri i metodi aritmetici per produrre cifre casuali è, ovviamente, in uno stato di peccato". Il meglio che possiamo sperare sono numeri pseudo-casuali, un flusso di numeri che appaiono come se sono stati generati casualmente.

Perché è impossibile produrre numeri veramente casuali in qualsiasi dispositivo deterministico? Cosa significa questa frase?


86
Stai davvero chiedendo perché non puoi produrre numeri veramente casuali su un dispositivo deterministico ? La domanda non include già la risposta?
citato il

37
Se tutti i numeri che generi devono essere univoci, non sono realmente casuali. È del tutto possibile che un vero generatore di numeri casuali fornisca lo stesso risultato dieci volte di seguito.
TMN

28
C'è un difetto nel cercare numeri casuali unici . Se stai costringendo i numeri a essere univoci , allora non sono casuali in quanto casuali richiede la possibilità di ripetizione, non importa quanto improbabile.
Mark Booth,

13
Al di fuori del computer, un numero casuale è mai veramente casuale? Lancia un dado, è fisica con solo un sacco di vettori.
MPelletier,

9
@MPelletier: Non proprio. La meccanica quantistica potrebbe (una volta che gli scienziati ne abbiano capito di più) implicare l'esistenza della vera casualità, a seconda della tua definizione di casualità.
Brian,

Risposte:


65

Si dovrebbe cercare un generatore di numeri pseudo-casuali sicuro crittograficamente . La maggior parte dei PRNG sono generatori di congruenza lineari (quindi next numberè una funzione lineare di previous number), quindi se tracciate next numbervs previous numberotterrete un grafico di linee parallele. Un CSPRNG non lo farà. Il compromesso è che sono lenti.

Raggruppo generatori di numeri casuali in 3 categorie :

  1. Abbastanza buono per i compiti.
  2. Abbastanza buono su cui scommettere la tua azienda.
  3. Abbastanza buono su cui scommettere il tuo paese.

Perché è impossibile produrre numeri veramente casuali in qualsiasi dispositivo deterministico?

Un dispositivo deterministico produrrà sempre lo stesso output quando avranno le stesse condizioni e input di partenza - questo è ciò che significa essere deterministic. "Numero davvero casuale" è più di un punto di vista filosofico, in quanto ciò che significa essere randomè il punto cruciale dell'osservazione filosofica dell'ombelico (la gente non è nemmeno sicura che il decadimento atomico sia casuale o segua un modello che non possiamo capire ancora). Un generatore di numeri casuali crittograficamente sicuro prenderà una fonte esterna di entropia per rendere il dispositivo non deterministico.


1
Ecco perché è impossibile ottenere un numero veramente casuale. Anche se la sequenza non si ripete mai, che non è garantito per casuali numeri, un altro funzionamento del programma con gli stessi input saranno gli stessi risultati. Quindi, qualcun altro può riprodurre i tuoi numeri casuali in un secondo momento, il che significa che non è stato affatto casuale.
Spencer Rathbun,

2
@ user973810 Il problema con quella definizione dalla teoria dell'informazione è che non è possibile esibire un'istanza effettiva di una sequenza casuale. Possiamo provare, per qualsiasi linguaggio di definizione ragionevole, che quasi ogni sequenza infinita (in senso tecnico) è casuale, perché non può essere affatto descritta nel linguaggio. Ciò che è più utile è il concetto di un generatore di sequenze casuali: non uno che produce una sequenza casuale, ma uno che produce una sequenza in modo casuale.
Gilles 'SO- smetti di essere malvagio' il

13
Leggero nitpick: alcune persone, vale a dire i fisici nucleari e delle particelle, sono abbastanza certi che processi come il decadimento atomico siano veramente casuali.
David Z,

9
@ David: possiamo andare anche un po 'oltre. I vari esperimenti sulla disuguaglianza di Bell mostrano che alcuni processi quantistici sono assolutamente imprevedibili . Possono essere casuali in un certo senso filosofico o dipendere da variabili nascoste non locali, ma entrambi i casi impediscono una previsione affidabile.
dmckee,

7
@dmckee: sì, ho appena pensato che sarebbe stato più facile stare lontano dal tentativo di spiegare la connessione tra la disuguaglianza di Bell e il collasso della funzione d'onda nei commenti su prog.SE. Le persone possono sempre venire sul nostro sito se sono curiose ;-) Tangurena: vero, Einstein lo ha detto, ma ciò significava solo che voleva davvero che l'universo fosse deterministico. Non lo è, però. Gli esperimenti condotti dopo la morte di Einstein lo hanno dimostrato in modo abbastanza conclusivo (escludendo variabili nascoste non locali, ovvero le stranezze ). Solo perché è Einstein non significa che avesse ragione su tutto.
David Z,

22

La vera casualità implica il non determinismo. Se è deterministico, può essere previsto con precisione (questo è ciò che significa determinismo); se può essere previsto, non è casuale.

La cosa migliore che puoi ottenere da un generatore di numeri pseudo-casuale deterministico è un flusso di numeri che ha un ciclo molto lungo (non è possibile non ripetere se il dispositivo RNG non ha memoria illimitata) che, per la durata del ciclo, produce un numeri di flusso che soddisfano tutte le altre proprietà di una sequenza casuale (una distribuzione uniforme di valori è la più interessante).

Per risolvere questo problema, molti moderni UNIX e Unix hanno kernel RNG che usano fonti di rumore fisico per generare casualità.

Un altro approccio comune è prendere il tempo corrente come seme per un RNG deterministico ( srand(time(NULL));in C); crittograficamente parlando, questo è inutile, dal momento che il momento attuale non è un segreto, ma per cose come simulazioni fisiche o videogiochi, è abbastanza buono.


Notare che la non ripetizione è impossibile anche per qualsiasi generatore con valore di uscita limitato (numero limitato di bit). Ma ovviamente la durata del ciclo di un generatore deterministico è molto probabilmente più breve del massimo teorico che è tutte le possibili permutazioni.
9000,

@ 9000: ovviamente questo non è vero. Prendi un numero irrazionale di usare le cifre (qualsiasi base) come sequenza "casuale". Boom! sequenza non ripetitiva (per definizione) e ancora limitata (alla base).
ThePopMachine,

@ThePopMachine: è possibile generare una sequenza non ripetitiva di bit di qualsiasi lunghezza, equivalente a una sequenza non ripetitiva di numeri di lunghezza illimitata. Non è possibile generare una sequenza non ripetitiva di numeri interi di magnitudo limitata (ad es. 32 bit); dopo aver generato tutte le permutazioni dei valori a 32 bit, è necessario ripetere una sequenza. Hai ragione; stiamo solo parlando di cose diverse.
9000

@ 9000: nessun weaseling. Hai fatto un'istruzione coperta che è falsa. Se davvero stai solo provando a non ci sono più di n ^ k diverse sequenze di lunghezza k per n valori diversi, e quindi deve ripetere, allora questo è abbastanza ovvio e non interessante.
ThePopMachine,

2
@ThePopMachine: Gradirei se ti attenuassi un po '. Per citare, «la non ripetizione è impossibile anche per qualsiasi generatore con valore di uscita limitato (numero limitato di bit)». Di cosa parli esplicitamente è un numero illimitato di bit, come una sequenza di cifre [binarie] di un numero irrazionale. La tua affermazione, sebbene vera, non è correlata al problema.
9000

10

Il secondo capitolo del libro Discrete-Event Simulation: A First Course di Lawrence Leemis offre una fantastica introduzione ai generatori di numeri casuali (o più precisamente, generatori di numeri psue-casuali).

Un estratto dal suo libro lo spiega bene secondo me:

Storicamente tre tipi di generatori di numeri casuali sono stati sostenuti per applicazioni computazionali: (a) generatori di ricerca di tabelle in stile anni '50 come, ad esempio, la tabella delle società RAND di un milione di cifre casuali; (b) generatori di hardware come, ad esempio, dispositivi di "rumore bianco" termico; e (c) generatori algoritmici (software). Di questi tre tipi, solo i generatori algoritmici hanno ottenuto un'accettazione diffusa. La ragione di ciò è che solo i generatori algoritmici hanno il potenziale per soddisfare tutti i seguenti criteri di generazione di numeri casuali generalmente ben accettati. Un generatore dovrebbe essere:

  • random - in grado di produrre output che superano tutti i test statistici ragionevoli di casualità;
  • controllabile - in grado di riprodurre il suo output, se lo si desidera;
  • portatile - in grado di produrre lo stesso output su un'ampia varietà di sistemi informatici;
  • efficiente - veloce, con requisiti minimi di risorse del computer;
  • documentato - analizzato teoricamente e ampiamente testato.

Quindi, mentre potrebbe essere possibile utilizzare un generatore di rumore bianco per ottenere numeri casuali "migliori", non hanno ottenuto l'accettazione perché non seguono la maggior parte dei criteri di cui sopra.

Consiglierei di mettere le mani su una copia di quel libro (o su qualcosa di simile). Comprendere esattamente come il lavoro di PRNG ti aiuterà sicuramente nei tuoi sforzi.


7

Perché è necessario scrivere codice per generare numeri casuali e il codice NON è casuale. (È deterministico)

Quindi finisci con un "valore (i) di seme" che viene scelto in "Casuale" (di solito il timestamp corrente) e poi lo usi in un algoritmo per iniziare a generare numeri. Ma l'intero set di si basa sul valore Seed originale!

Quindi, se esegui di nuovo il tuo codice con lo stesso identico valore / i Seed, otterrai lo stesso SET ESATTO di numeri! Come può una persona ragionevole chiamarlo casuale? Ma Sicuramente GUARDA a caso.


Riguardo a renderli unici, dopo aver generato un numero è sufficiente verificare se si dispone già di quel numero, se lo si fa, gettarlo via e generarne uno nuovo.


13
Tra i lati positivi, i numeri pseudo-casuali ripetibili possono essere ottimi per il debug.
David Thornley,

5

Poiché stai generando numeri casuali, dovresti aspettarti che i valori generati non siano univoci. Questa è una proprietà della casualità: non si può dire che una sequenza di numeri veramente casuali (o persino pseudo-casuali) sia unica, poiché tale requisito consentirebbe di prevedere il valore finale nell'intervallo, oltre a modificare la probabilità di tutti i numeri non scelti ogni volta che ne viene selezionato uno nuovo.


1
Questo è davvero un commento piuttosto che una risposta, in quanto in realtà non risponde alla domanda .
Mark Booth,

5

Ho una definizione molto semplice di Pseudo Random :

Troppe variabili sconosciute da prevedere.

Ho anche una semplice definizione di True Random :

Infinite variabili sconosciute.

Il problema con un computer è che conosce sempre TUTTE le variabili. Il numero casuale è semplicemente una funzione matematica di un valore di seme .
Il meglio che possiamo fare è dare al computer un valore seme pseudo-casuale, che di solito si basa su una variabile che non possiamo prevedere (come l'ora esatta).

Anche se un computer non è assolutamente in grado di creare un numero casuale, è bravo a introdurre troppe variabili da prevedere!


1
Bene, "il tempo" è un cattivo esempio di qualcosa che non può essere previsto. D'altra parte, il movimento del mouse, l'input del microfono, ecc. Sono input che non sono prevedibili.
HoLyVieR il

3

Generare numeri veramente casuali nel software non è in effetti possibile come altri hanno sottolineato, tuttavia è possibile con l'hardware costruire un dispositivo in grado di generare numeri veramente casuali *. Ci sono alcuni esempi di questo su Internet e ci sono una varietà di metodi usati, dalla lettura del tempo tra le zecche sul contatore Geiger al campionamento del rumore bianco (principalmente radiazione di fondo dall'universo) di un ricevitore non sintonizzato. Io stesso ne ho costruiti alcuni usando alcuni dei metodi disponibili.

* Qualsiasi bravo fanatico della fisica sottolineerà che, dato il modo in cui l'universo opera, nessuno di questi è iper-tecnicamente veramente casuale, ma non esiste un modo ragionevole per prevederne i risultati, quindi per motivi di discussione sono sufficienti.


5
Come fanatici della fisica part-time, i generatori basati su eventi quantistici sono (per quanto ne siamo stati in grado di dire) veramente casuali. Le persone a cui non piace la casualità hanno cercato di eliminare la casualità dalla meccanica quantistica da quando è iniziata, e tutto ciò che è stato fatto è accumulare più prove del fatto che sia davvero casuale.
David Thornley,

@DavidThornley, ... fino a quando qualcuno non capirà la formula.
CaffGeek,

1
@Chad: non esiste una formula nel solito senso; che è stato escluso dagli esperimenti EPR. È certamente immaginabile che sia tutto deterministico, ma non in alcun modo facilmente comprensibile.
David Thornley,

@DavidThornley, sapevo che era la parola sbagliata da usare. Penso che sappiamo cosa stavo cercando di dire. Quasi ogni volta che qualcuno dice che qualcosa è impossibile, qualcun altro alla fine si dimostra sbagliato. È la natura umana.
CaffGeek,

2
È come dire che alla fine qualcuno costruirà una macchina in grado di risolvere il problema di arresto perché qualcuno ha detto che era impossibile. Non si tratta di trovare l'equazione, in realtà è casuale in base a tutti gli esperimenti che sono stati condotti e alla matematica che lo supporta.
Alex,

2

Non è possibile produrre un numero casuale senza un hardware speciale. Nel mio primo anno, un paio di compagni di classe e io abbiamo proposto un generatore di numeri casuali che ha fondamentalmente un ricevitore AM e sintonizzato su 4 canali diversi, ottenere l'ingresso in un convertitore da A a D e aggiungerli tutti (modulo il numero massimo). Poiché la combinazione di ingressi analogici da qualsiasi numero arbitrario di stazioni è casuale e potremmo produrre un gran numero di numeri casuali dal convertitore A2D, abbiamo proposto che questo potrebbe essere un buon generatore. Certo, anche questo non è veramente casuale in senso filosofico, anche se per la maggior parte degli scopi pratici potrebbe funzionare.


2

Il determinismo è essenzialmente una funzione. Ricorda da Algebra che una funzione è una corrispondenza tra un dominio e un intervallo in modo tale che ciascun membro del dominio corrisponda esattamente a un membro dell'intervallo.

Quindi se f (x) = z, f (x)! = Y a meno che y sia z. Questa è una funzione. Immagina JavaScript:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Non importa quante volte lo chiami Add(2,3)restituirà sempre 5. In altre parole, Aggiungi () è una funzione deterministica.

I fattori esterni possono far sì che Add si comporti in modo non deterministico. Ad esempio, se si introduce il multithreading nell'equazione. L'input umano causa anche non determinismo.

Ora, qui è dove le cose si fanno interessanti.

"Chiunque consideri i metodi aritmetici per produrre cifre casuali è, ovviamente, in uno stato di peccato."

Nota Von Neumann afferma "metodi aritmetici di produzione [...]". Non si tratta di input umani, concorrenza, velocità del vento campione lette da uno strumento preciso o altri modi non algoritmici di produrre input casuali per una funzione deterministica.

Questo semplicemente afferma che una funzione o un sistema di funzioni non diventerà improvvisamente non deterministico. In altre parole, Aggiungi (2,3) non restituirà in qualche modo 6 o qualcosa di diverso da 5 dati gli stessi input . Questo è impossibile.

L'autore della citazione fa un ulteriore passo avanti.

Il meglio che possiamo sperare sono i numeri pseudo-casuali, un flusso di numeri che sembrano generati casualmente.

Il contesto è precedentemente definito come "su qualsiasi dispositivo deterministico". Potrei finire l'argomento qui. Ma cosa succede se cambiamo il contesto introducendo un nuovo elemento nel sistema? Un elemento non deterministico aggiunto come input rende il sistema un sistema non deterministico. Sebbene, rimuovendo l'elemento non deterministico, siamo ridotti a un sistema deterministico. Se possiamo in qualche modo tracciare o riprodurre in altro modo gli input, possiamo riprodurre un risultato. Ma questo intero paragrafo è tangibile a ciò che dice l'autore. Ricorda il contesto.

Si potrebbe discutere sul significato del non determinismo. Ancora una volta, tangetenale. Ricorda il contesto.

Quindi ha ragione. Su qualsiasi dispositivo deterministico è impossibile per un sistema deterministico produrre un vero risultato casuale.

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.