Cos'è esattamente un seme in un generatore di numeri casuali?


21

Ho provato qualche consueta ricerca su Google ecc. Ma la maggior parte delle risposte che trovo sono in qualche modo ambigue o specifiche di una lingua / libreria come Python o C ++ stdlib.hecc. Sto cercando una lingua agnostica, una risposta matematica, non i dettagli di una biblioteca.

Ad esempio, molti affermano che il seme è un punto di partenza del generatore di numeri casuali e lo stesso seme produce sempre lo stesso numero casuale. Cosa significa? Significa che il numero di output è una funzione deterministica di un seme specifico e la casualità deriva dal valore del seme? Ma se è così, allora fornendo il seme, non siamo noi programmatori a creare la casualità invece di lasciare che la macchina lo faccia?

Inoltre, cosa significa un punto di partenza in questo contesto? È un modo non rigoroso di dire un elemento xX del dominio di una mappa f:XY ? O sto sbagliando qualcosa?


7
Non mi sento qualificato per scrivere una risposta, ma potresti trovare l'articolo di Wikipedia sull'illuminante Mersenne Twister , in particolare la sezione sull'inizializzazione . In breve, un generatore di numeri pseudocasuali come il Mersenne Twister alla fine ripeterà il suo output. Nel caso della MT il periodo ha una durata 2^19937 − 1. Il seme è il punto di questa sequenza estremamente lunga in cui inizia il generatore. Quindi sì, è deterministico.
IonicSolutions il

1
Un generatore di numeri pseudo-casuale è un elenco fisso di numeri che si ripete all'infinito. Dove inizia? Puoi dire.
whuber

2
@whuber In realtà penso che il tuo commento sarebbe un'ottima risposta.
David Z,

Risposte:


22

La maggior parte dei generatori di numeri pseudo-casuali (PRNG) sono basati su algoritmi che coinvolgono un qualche tipo di metodo ricorsivo a partire da un valore di base che è determinato da un input chiamato "seed". Il PRNG predefinito nella maggior parte dei software statistici (R, Python, Stata, ecc.) È l' algoritmo Mersenne Twister MT19937, che è esposto a Matsumoto e Nishimura (1998) . Questo è un algoritmo complicato, quindi sarebbe meglio leggere il documento su di esso se vuoi sapere come funziona in dettaglio. In questo particolare algoritmo, esiste una relazione di ricorrenza di grado e il seme ingresso è un insieme iniziale di vettori x 0 , x 1 , . . . ,n . L'algoritmo utilizza una relazione di ricorrenza lineare che genera:x0,x1,...,xn1

xn+k=f(xk,xk+1,xk+m,r,A),

1mnrA

Ora, è importante notare che questo è solo un esempio, usando l'algoritmo MT19937. Esistono molti PRNG che possono essere utilizzati nel software statistico e ciascuno di essi comporta diversi metodi ricorsivi, quindi il seme significa una cosa diversa (in termini tecnici) in ciascuno di essi. È possibile trovare una libreria di PRNG per Rin questa documentazione , che elenca gli algoritmi disponibili e gli articoli che descrivono questi algoritmi.

Lo scopo del seed è consentire all'utente di "bloccare" il generatore di numeri pseudo-casuali, per consentire analisi replicabili. Ad alcuni analisti piace impostare il seed utilizzando un vero generatore di numeri casuali (TRNG) che utilizza input hardware per generare un numero seed iniziale, quindi riportarlo come numero bloccato. Se il seed viene impostato e segnalato dall'utente originale, un auditor può ripetere l'analisi e ottenere la stessa sequenza di numeri pseudo-casuali dell'utente originale. Se il seed non è impostato, l'algoritmo userà di solito un tipo di seed predefinito (ad es. Dall'orologio di sistema) e in genere non sarà possibile replicare la randomizzazione.


+1. Sarebbe bene aggiungere cosa (di solito) succede se non si fornisce esplicitamente il seme.
ameba dice Ripristina Monica il

1
@amoeba: il quarto paragrafo della mia risposta, ne discute brevemente.
BruceET,

1
Mentre questo risponde alle basi di question.it non tocca il fatto che ne abbiamo bisogno nelle simulazioni. È molto difficile produrre una VERA casualità - e quando ce l'hai non puoi riprodurre la risposta originale! Inserisci il PNRG ... con tutti i suoi problemi.
Paul Palmpje,

@amoeba: Come richiesto, ho aggiunto un paragrafo aggiuntivo per approfondire.
Ripristina Monica il

1
Grazie. "Seme predefinito" suona un po 'come se fosse sempre lo stesso valore predefinito di seme; quello che volevo dire è che di solito il seme viene preso dall'orologio di sistema. Questo penso sia buono a sapersi.
ameba dice Ripristina Monica il

16

Innanzitutto, non vi è vera casualità nei "numeri casuali" generati dal computer di oggi. Tutti i generatori pseudocasuali usano metodi deterministici. (Forse, i computer quantistici lo cambieranno.)

Il difficile compito è ideare algoritmi che producono output che non possono essere significativamente distinti dai dati provenienti da una fonte veramente casuale.

Hai ragione che l'impostazione di un seme ti avvia in un punto di partenza noto in un lungo elenco di numeri pseudocasuali. Per i generatori implementati in R, Python e così via, l'elenco è enormemente lungo. Abbastanza a lungo che nemmeno il più grande progetto di simulazione possibile supererà il "periodo" del generatore in modo che i valori inizino a riciclo.

In molte applicazioni ordinarie, le persone non devono impostare un seme. Quindi un seme imprevedibile viene raccolto automaticamente (ad esempio, dai microsecondi sull'orologio del sistema operativo). I generatori pseudocasuali in uso generale sono stati sottoposti a batterie di test, in gran parte costituiti da problemi che si sono dimostrati difficili da simulare con generatori precedentemente insoddisfacenti.

Di solito, l'output di un generatore è costituito da valori che non sono, ai fini pratici, distinguibili dai numeri scelti veramente a caso dalla distribuzione uniforme suQuindi quei numeri pseudocasuali vengono manipolati in modo da abbinare ciò che si otterrebbe campionando a caso da altre distribuzioni come binomiale, Poisson, normale, esponenziale, ecc.(0,1).

Un test di un generatore è vedere se le sue coppie successive in "osservazioni" simulate come sembrano effettivamente riempire il quadrato dell'unità a caso. (Fatto due volte sotto.) L'aspetto leggermente marmorizzato è il risultato della variabilità intrinseca. Sarebbe molto sospetto ottenere una trama che fosse perfettamente uniformemente grigia. [Ad alcune risoluzioni, potrebbe esserci un modello di moiré regolare; si prega di cambiare l'ingrandimento verso l'alto o verso il basso per eliminare l'effetto fasullo se si verifica.]Unif(0,1)

set.seed(1776);  m = 50000
par(mfrow=c(1,2))
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
  u = runif(m);  plot(u[1:(m-1)], u[2:m], pch=".")
par(mfrow=c(1,1))

inserisci qui la descrizione dell'immagine

A volte è utile impostare un seme. Alcuni di questi usi sono i seguenti:

  1. Durante la programmazione e il debug è conveniente avere un output prevedibile. Tanti programmatori inseriscono una set.seeddichiarazione all'inizio di un programma fino a quando non si scrivono e si esegue il debug.

  2. Quando si insegna sulla simulazione. Se voglio mostrare agli studenti che posso simulare i tiri di un dado giusto usando la samplefunzione in R, potrei imbrogliare, eseguire molte simulazioni e scegliere quello che si avvicina di più a un valore teorico target. Ma ciò darebbe un'impressione irrealistica di come funziona davvero la simulazione.

    Se imposto un seme all'inizio, la simulazione otterrà lo stesso risultato ogni volta. Gli studenti possono correggere le bozze del mio programma per assicurarsi che fornisca i risultati desiderati. Quindi possono eseguire le proprie simulazioni, con i propri semi o lasciando che il programma scelga il proprio punto di partenza.

    Ad esempio, la probabilità di ottenere il totale 10 quando si due dadi equi èCon un milione di esperimenti a 2 dadi dovrei ottenere una precisione di circa due o tre posizioni. Il margine di errore di simulazione del 95% è di circa

    3/36=1/12=0.08333333.
    2(1/12)(11/12)/106=0.00055.
    set.seed(703);  m = 10^6
    s = replicate( m, sum(sample(1:6, 2, rep=T)) )
    mean(s == 10)
    [1] 0.083456         # aprx 1/12 = 0.0833
    2*sd(s == 10)/sqrt(m)
    [1] 0.0005531408     # aprx 95% marg of sim err.
    
  3. Quando si condividono analisi statistiche che implicano la simulazione. Oggi molte analisi statistiche implicano una simulazione, ad esempio un test di permutazione o un campionatore di Gibbs. Mostrando il seme, permetti alle persone che leggono l'analisi di replicare esattamente i risultati, se lo desiderano.

  4. Quando si scrivono articoli accademici che coinvolgono la randomizzazione. Gli articoli accademici di solito passano attraverso più cicli di revisione tra pari. Una trama può usare, ad esempio, punti di jitter casuali per ridurre la sovrapposizione. Se le analisi devono essere leggermente modificate in risposta ai commenti dei revisori, è bene che un particolare jittering non correlato non cambi tra i cicli di revisione, il che potrebbe essere sconcertante per i revisori particolarmente pignoli, quindi si imposta un seme prima del jitter.


1
Molto bello, +1. Mi sono preso la libertà di aggiungere un quarto punto.
S. Kolassa - Ripristina Monica il

Quindi vuoi dire che un generatore di numeri pseudorandrom memorizza sostanzialmente una sequenza periodica di numeri casuali (distribuiti uniformemente in [0, 1]) e un seme è semplicemente un indice della sequenza? Quindi significa che il numero casuale generato è una funzione deterministica del seme?
Della

9
Non hai bisogno di un computer quantistico per usare i fenomeni quantistici per avere un generatore casuale ( en.wikipedia.org/wiki/Hardware_random_number_generator )
Guiroux

1
@Della. Hai essenzialmente l'idea giusta. Ma per favore capisci che in pratica il 'periodo' deve essere davvero enorme. (Non importa quanto sia grande il tuo progetto di simulazione, non vuoi che si ripeta.) Ad esempio, IonicSolutions commenta dopo la Q che il generatore Mersenne Twilster ha il periodo un po 'più grande di quanto possa facilmente visualizzare. // Se conosci il seme, puoi produrre il pseudorandom seq da lì. // I generatori sono stati usati per crittografare i messaggi. Ma gli standard per i generatori sicuri per la crittografia sono diversi dagli standard per i generatori per la simulazione di probabilità. 2199371,
BruceET,

@Guiroux. La possibilità che stavo cercando di menzionare i computer quantistici era quella di avere veri generatori di numeri casuali alla stessa velocità dei generatori pseudocasuali di oggi. Negli anni '50 furono utilizzate fonti di numeri casuali "veri" per la randomizzazione nella progettazione sperimentale e per simulazioni prob (lente, limitate). Forse vedi milioni di cifre casuali .
BruceET,

0

TL; DR;

Un seme di solito ti consente di riprodurre la sequenza di numeri casuali. In tal senso non sono veri numeri casuali ma "numeri pseudo casuali", quindi un generatore PNR (PNRG). Questi sono un vero aiuto nella vita reale!

Un po 'più di dettaglio:

Praticamente tutti i generatori di numeri "casuali" implementati in linguaggi informatici sono generatori di numeri pseudo casuali. Questo perché dato un valore iniziale (===> il seme) forniranno sempre la stessa sequenza di risultati pseudo casuali. Un buon generatore produrrà una sequenza che non può essere distinta - in termini statistici - da una vera sequenza casuale (lanciare un dado vero, una vera moneta, ecc.).

In molti casi di simulazione si desidera avere una vera esperienza "casuale". Tuttavia, vuoi anche essere in grado di riprodurre i tuoi risultati. Perché? Bene, almeno i regolatori sono interessati a quella cosa peculiare.

C'è molto da approfondire. Le persone fanno persino analisi sul "migliore" seme casuale. A mio avviso, questo invalida il loro modello in quanto non sono in grado di gestire un comportamento casuale "vero" o il loro PRNG non è adatto alla loro implementazione. Il più delle volte non fanno abbastanza simulazioni, ma richiedono tempo.

Ora immagina un "vero" RNG. Si potrebbe implementare questo in base a una sorta di casualità nella macchina. Se prendi solo un seme casuale (es. Ora), crei una specie di punto iniziale casuale, ma la casualità della sequenza dipende ancora dall'algoritmo per determinare i numeri successivi. Questo è più importante del punto di partenza nella maggior parte dei casi poiché la distribuzione dei risultati determina il "risultato" effettivo. Se la sequenza dovesse essere davvero casuale, come la implementeresti? Si può dire che le zecche dell'orologio di un computer siano deterministiche e che altrimenti mostreranno molta auto-correlazione. Che cosa si può fare? La scommessa migliore finora è implementare un solido PNRG.

Informatica quantistica? Non sono sicuro che lo risolverà.

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.