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))
A volte è utile impostare un seme. Alcuni di questi usi sono i seguenti:
Durante la programmazione e il debug è conveniente avere un output prevedibile. Tanti programmatori inseriscono una set.seed
dichiarazione all'inizio di un programma fino a quando non si scrivono e si esegue il debug.
Quando si insegna sulla simulazione. Se voglio mostrare agli studenti che posso simulare i tiri di un dado giusto usando la sample
funzione 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.
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.
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.
2^19937 − 1
. Il seme è il punto di questa sequenza estremamente lunga in cui inizia il generatore. Quindi sì, è deterministico.