Generazione di numeri casuali manualmente


30

Come posso generare manualmente un numero casuale da una determinata distribuzione, come ad esempio 10 realizzazioni dalla distribuzione normale standard?


10
Puoi spiegare perché vuoi fare questo e quali altri vincoli ci sono?
mdewey,

2
È possibile ottenere una tabella di numeri casuali (rand usato per pubblicarli tra gli altri).
Batman,

4
@Batman: sì, davvero, e il libro RAND di 10 numeri casuali ha ottenuto 655 commenti su Amazon. Tutto prevedibile ovviamente.
Xi'an

10
(Sono sorpreso che nessuno abbia mai commentato prima) A meno che non sia assolutamente essenziale non si dovrebbe provare a usare implementazioni personalizzate per generare numeri casuali. Sì, è bello sapere come farlo ed è probabilmente la prima cosa che ti verrà mostrato in una classe " Metodi MC " (ed è fantastico!), Ma non farlo in nessun progetto di vita reale. Esistono routine di generazione di numeri casuali specializzate per un motivo, l'implementazione da zero di un algoritmo core è una perdita di tempo, fonte di bug e scarsi sforzi di consapevolezza sul campo.
usεr11852 dice Reinstate Monic il

2
@ Xi'an: Sì, sono d'accordo che sia una presunzione sicura. Come accennato, questo è solo un commento per mettere in guardia le persone dall'utilizzare il proprio RNG senza rendersi conto che la progettazione di RNG è un'attività molto seria. Per citare von Neumann : "Chiunque consideri i metodi aritmetici per produrre cifre casuali è, ovviamente, in uno stato di peccato".
usεr11852 dice Reinstate Monic il

Risposte:


46

Se "manualmente" include "meccanico" allora hai molte opzioni a tua disposizione. Per simulare una variabile di Bernoulli con metà probabilità, possiamo lanciare una moneta: per le code, 1 per le teste. Per simulare una distribuzione geometrica possiamo contare quanti lanci di monete sono necessari prima di ottenere le teste. Per simulare una distribuzione binomiale, possiamo lanciare la nostra moneta n volte (o semplicemente lanciare n01nn monete) e contare le teste. La "quincunx" o "macchina per fagioli" o "scatola di Galton" è un'alternativa più cinetica - perché non metterne in azione e vedere di persona ? Sembra che non esista una "moneta ponderata"ma se desideriamo variare il parametro di probabilità del nostro Bernoulli o variabile binomiale su valori diversi da , l'ago di Georges-Louis Leclerc, il conte di Buffon ci permetterà di farlo. Per simulare la distribuzione uniforme e discreta su { 1 , 2 , 3 , 4 , 5 , 6 } lanciamo un dado a sei facce. I fan dei giochi di ruolo avranno incontrato dadi più esotici , ad esempio dadi tetraedrici per campionare uniformemente da { 1 , 2 , 3 , 4 }p=0.5{1,2,3,4,5,6}{1,2,3,4}, mentre con un filatore o una ruota della roulette si può andare ancora più lontano. ( Credito immagine )

Varietà di dadi

Dovremmo essere pazzi per generare numeri casuali in questo modo oggi, quando è solo un comando di distanza su una console di computer - o, se abbiamo una tabella adatta di numeri casuali disponibile, una incursione negli angoli più polverosi dello scaffale? Bene forse, anche se c'è qualcosa di piacevolmente tattile in un esperimento fisico. Ma per le persone che lavoravano prima dell'era del computer, anzi prima delle tabelle numeriche casuali su larga scala ampiamente disponibili (di cui più avanti), la simulazione manuale delle variabili casuali aveva un'importanza pratica. Quando Buffon indagò sul paradosso di San Pietroburgo- il famoso gioco del lancio delle monete in cui la quantità che il giocatore vince raddoppia ogni volta che viene lanciata una testa, il giocatore perde sulle prime code e il cui rendimento atteso è controintuitivamente infinito - doveva simulare la distribuzione geometrica con . Per fare ciò, sembra che abbia assunto un bambino per lanciare una moneta per simulare 2048 partite del gioco di San Pietroburgo, registrando quanti tiri prima della fine del gioco. Questa distribuzione geometrica simulata è riprodotta in Stigler (1991) :p=0.5

Tosses Frequency
1      1061
2      494
3      232
4      137
5      56
6      29
7      25
8      8
9      6

Nello stesso saggio in cui pubblicò questa indagine empirica sul paradosso di San Pietroburgo, Buffon introdusse anche il famoso " ago di Buffon ". Se un piano è diviso in strisce da linee parallele distanti una distanza , e un ago di lunghezza l d viene lasciato cadere su di esso, la probabilità che l'ago attraversi una delle linee è di 2 ldld .2lπd

Esperimento con ago di Buffon

L'ago di Buffon può quindi essere usato per simulare una variabile casuale oXBinomiale(n,2lXBernoulli(2lπd), e possiamo regolare la probabilità di successo alterando la lunghezza dei nostri aghi o (forse più convenientemente) la distanza alla quale governiamo le linee. Un uso alternativo degli aghi di Buffon è un modo terribilmente inefficiente per trovare un'approssimazione probabilistica diπ. L'immagine (credito) mostra 17 fiammiferi, di cui 11 attraversano una linea. Quando la distanza tra le linee rette è impostata uguale alla lunghezza del fiammifero, come qui, la proporzione prevista di fiammiferi incrociati è2XBinomial(n,2lπd)π e quindi si può stimare π come due volte il reciproco della frazione osservato: qui otteniamo π =2172ππ^. Nel 1901 Mario Lazzarini ha affermato di aver eseguito l'esperimento utilizzando aghi di 2,5 cm con linee 3 cm di distanza, e dopo 3408 lanci ottenuti π =355π^=217113.1 . Questo è un razionale ben noto aπ, preciso con sei decimali. Badger (1994) fornisce prove convincenti che ciò era fraudolento, non ultimo quello di essere fiducioso al 95% di sei cifre decimali di precisione usando l'apparato di Lazzarini, bisogna lanciare 134 trilioni di aghi che sbalzano la pazienza! Certamente l'ago di Buffon è più utile come generatore di numeri casuali che come metodo per stimareππ^=355113ππ .


Finora i nostri generatori sono stati deludentemente discreti. E se volessimo simulare una distribuzione normale? Un'opzione è ottenere cifre casuali e usarle per formare buone approssimazioni discrete a una distribuzione uniforme su , quindi eseguire alcuni calcoli per trasformarle in deviazioni normali casuali. Uno spinner o una roulette potrebbero fornire cifre decimali da zero a nove; un dado può generare cifre binarie; se le nostre abilità aritmetiche sono in grado di far fronte a una base più funkier, farebbe anche un set standard di dadi. Altre risposte hanno coperto questo tipo di approccio basato sulla trasformazione in modo più dettagliato; Rinvio ogni ulteriore discussione al riguardo fino alla fine.[0,1]

Alla fine del diciannovesimo secolo l'utilità della distribuzione normale era ben nota, e quindi c'erano statistici desiderosi di simulare deviati normali casuali. Inutile dire che i lunghi calcoli manuali non sarebbero stati adatti se non per impostare il processo di simulazione in primo luogo. Una volta stabilito ciò, la generazione dei numeri casuali doveva essere relativamente semplice e veloce. Stigler (1991) elenca i metodi impiegati da tre statistici di questa era. Tutti studiavano tecniche di livellamento: deviatori normali casuali erano di evidente interesse, ad esempio per simulare errori di misurazione che dovevano essere livellati.

Il notevole statistico americano Erastus Lyman De Forest era interessato a smussare le tabelle di vita e incontrò un problema che richiedeva la simulazione dei valori assoluti dei deviati normali. In quello che si dimostrerà un tema corrente, De Forest stava davvero campionando da una distribuzione quasi normale . Inoltre, anziché usare una deviazione standard di uno (la che siamo abituati a chiamare "standard"), De Forest voleva un "probabile errore" (deviazione mediana) di uno. Questa era la forma data nella tabella di "Probabilità di errori" nelle appendici di "Un manuale di astronomia sferica e pratica, volume II" diZN(0,12)William Chauvenet . Da questa tabella, De Forest ha interpolato i quantili di una distribuzione semi-normale, da a p = 0,995 , che ha ritenuto essere "errori di uguale frequenza".p=0.005p=0.995

Tabella De Forest di errori di uguale frequenza

Se desideri simulare la distribuzione normale, seguendo De Forest, puoi stampare questa tabella e tagliarla. De Forest (1876) scrisse che gli errori "sono stati incisi su 100 pezzi di cartoncino di uguali dimensioni, che sono stati scossi in una scatola e tutti estratti uno per uno".

L'astronomo e meteorologo Sir George Howard Darwin (figlio del naturalista Charles) ha dato una svolta diversa alle cose, sviluppando quella che ha chiamato una "roulette" per generare deviati normali casuali. Darwin (1877) descrive come:

Un pezzo di carta circolare è stato graduato radialmente, quindi una graduazione contrassegnata con era 720xgradi distante da un raggio fisso. La carta è stata fatta girare attorno al suo centro vicino a un indice fisso. È stato quindi girato più volte e, interrompendolo, è stato letto il numero opposto all'indice. [Darwin aggiunge in una nota a piè di pagina: è meglio fermare il disco quando gira così velocemente che le graduazioni sono invisibili, piuttosto che lasciarlo scorrere.] Dalla natura della laurea i numeri così ottenuti si verificheranno esattamente allo stesso modo in cui si verificano nella pratica errori di osservazione; ma non hanno segni di addizione o sottrazione con prefisso. Quindi lanciando una moneta ancora e ancora e chiamando teste+e code-, i segni720π0xex2dx+- o - sono assegnati per caso a questa serie di errori.+-

"Indice" dovrebbe essere letto qui come "puntatore" o "indicatore" (vedi "dito indice"). Stigler sottolinea che Darwin, come De Forest, stava usando una distribuzione cumulativa quasi normale attorno al disco. Successivamente l'uso di una moneta per attaccare un segno a caso rende questa una distribuzione completamente normale. Stigler osserva che non è chiaro quanto finemente sia stata graduata la bilancia, ma presume che l'istruzione per arrestare manualmente il mid-spin del disco fosse "per ridurre la potenziale propensione verso una sezione del disco e accelerare la procedura".

Sir Francis Galton , tra l'altro mezzo cugino di Charles Darwin, è già stato menzionato in relazione al suo quinconce. Mentre questo simula meccanicamente una distribuzione binomiale che, secondo il teorema di De Moivre – Laplace assomiglia in modo sorprendente alla distribuzione normale (e viene occasionalmente usata come supporto didattico per quell'argomento), Galton ha effettivamente prodotto uno schema molto più elaborato quando desiderava campione da una distribuzione normale. Ancora più straordinario degli esempi non convenzionali in cima a questa risposta, Galton ha sviluppato dadi distribuiti normalmente- o più precisamente, una serie di dadi che producono un'eccellente approssimazione discreta a una distribuzione normale con una deviazione mediana. Questi dadi, risalenti al 1890, sono conservati nella Collezione Galton presso l'University College di Londra.

Dadi normali Galton

In un articolo del 1890 su Nature, Galton scrisse che:

Come strumento per selezionare a caso, non ho trovato nulla di meglio dei dadi. È più noioso mescolare accuratamente le carte tra ogni estrazione successiva, e il metodo di mescolare e mescolare le palline segnate in una borsa è ancora più noioso. A questi è preferibile un astemio o una qualche forma di roulette, ma i dadi sono migliori di tutti. Quando vengono scossi e gettati in un cesto, si scuotono in modo così vario l'uno contro l'altro e contro le costole del cesto che si agitano selvaggiamente, e le loro posizioni all'inizio non forniscono alcun indizio percettibile su ciò che saranno anche dopo un unico buon scuotimento e lancio. Le possibilità offerte da un dado sono più diverse di quanto si pensi comunemente; ci sono 24 pari possibilità, e non solo 6, perché ogni faccia ha quattro spigoli che possono essere utilizzati, come mostrerò.

+114

Design dei dadi normale Galton

Raazesh Sainudiin's Laboratory for Mathematical Statistical Experiments include un progetto studentesco dell'Università di Canterbury, in Nuova Zelanda, che riproduce i dadi di Galton . Il progetto include un'indagine empirica dal lancio dei dadi molte volte (incluso un CDF empirico che sembra rassicurantemente "normale") e un adattamento dei punteggi dei dadi in modo che seguano la distribuzione normale standard. Usando i punteggi originali di Galton, c'è anche un grafico della distribuzione normale discretizzata che i punteggi dei dadi seguono effettivamente.

Galton dice una distribuzione discreta


Su vasta scala, se sei pronto ad allungare il "meccanico" all'elettrico, nota che l'epico RAND A Million Random Digits con 100.000 Normal Deviates si basava su una sorta di simulazione elettronica di una ruota della roulette. Dal rapporto tecnico (di George W. Brown, originariamente giugno 1949) troviamo:

Così motivato, il personale RAND, con l'assistenza del personale tecnico della Douglas Aircraft Company, ha progettato una ruota per roulette elettronica basata su una variante di una proposta fatta da Cecil Hastings. Ai fini di questo discorso sarà sufficiente una breve descrizione. Una sorgente di impulsi di frequenza casuale era controllata da un impulso di frequenza costante, circa una volta al secondo, che forniva in media circa 100.000 impulsi in un secondo. I circuiti di standardizzazione degli impulsi hanno passato gli impulsi a un contatore binario a cinque posizioni, in modo che in linea di principio la macchina sia come una ruota della roulette con 32 posizioni, realizzando in media circa 3000 giri per giro. È stata utilizzata una conversione binaria in decimale, eliminando 12 delle 32 posizioni e la cifra casuale risultante è stata inserita in un punzone IBM, producendo tabelle di schede perforate di cifre casuali.

χ2i test sulle frequenze delle cifre pari e dispari hanno rivelato che alcuni lotti presentavano un leggero squilibrio. Questo è stato peggio in alcuni lotti rispetto ad altri, suggerendo che "la macchina si stava esaurendo nel mese dalla sua messa a punto ... Le indicazioni su questa macchina hanno richiesto una manutenzione eccessiva per mantenerlo in perfetta forma". Tuttavia, è stato trovato un modo statistico per risolvere questi problemi:

A questo punto avevamo le nostre milioni originali di cifre, 20.000 carte IBM con 50 cifre su una carta, con il piccolo ma percettibile pregiudizio pari-dispari rivelato dall'analisi statistica. Ora è stato deciso di randomizzare il tavolo, o almeno di modificarlo, con un po 'di roulette giocando con esso, per eliminare il pregiudizio dispari-pari. Abbiamo aggiunto (mod 10) le cifre in ogni carta, cifra per cifra, alle cifre corrispondenti della carta precedente. La tabella derivata di un milione di cifre è stata quindi sottoposta a vari test standard, test di frequenza, test seriali, test di poker, ecc. Questi milioni di cifre hanno un buono stato di salute e sono stati adottati come la moderna tabella di cifre casuali di RAND.

Naturalmente c'erano buone ragioni per credere che il processo di aggiunta avrebbe fatto del bene. In generale, il meccanismo sottostante è l'approccio limitante di somme di variabili casuali modulo l'intervallo unitario nella distribuzione rettangolare, allo stesso modo in cui somme illimitate di variabili casuali si avvicinano alla normalità. Questo metodo è stato utilizzato da Horton e Smith, dell'Interstate Commerce Commission, per ottenere alcuni buoni lotti di numeri apparentemente casuali da lotti più grandi di numeri gravemente non casuali.

[0,1]u[0,1]FF-1(u)

Ziggurat per metà normale

Riferimenti


(*)"Chiunque consideri i metodi aritmetici per produrre cifre casuali è, ovviamente, in uno stato di peccato. Perché, come è stato sottolineato più volte, non esiste un numero casuale - ci sono solo metodi per produrre numeri casuali e ovviamente una rigorosa procedura aritmetica non è un tale metodo. "


5
Stai scherzando ... (ma sì, è davvero manualmente +1)
nalzok,

8
Quanto lavoro messo in questo!
Richard Hardy,

3
Nota che i dadi non standard possono essere ingiusti, quindi è bene testarli prima, ad es. Youtube.com/watch?v=VI3N4Qg-JZM
Tim

2
@RichardHardy Paradossalmente, in realtà è più facile per me scrivere tutte queste cose mentre è di fronte a me, e almeno temporaneamente archiviato nella mia memoria, piuttosto che cercare di portarmelo tutto in testa!
Silverfish,

2
In ogni caso, lo trovo impressionante!
Richard Hardy,

44

X=-2logU1cos(2πU2)
Y=-2logU1peccato(2πU2)X

Ad esempio, sul mio sistema operativo Linux, posso verificare

$ date +%s.%N
1479733744.077762986
$ date +%s.%N
1479733980.615056616

U1=,077,762986 millions, U2=,615,056616 millions
e X come
> sqrt(-2*log(.077762986))*cos(2*pi*.615056616)
[1] -1.694815

Addendum: poiché i logaritmi di calcolo e i coseni possono essere considerati non abbastanza manuali , esiste una variante di Box-Müller che evita di usare quelle funzioni trascendentali (vedi Esercizio 2.9 nel nostro libro Metodi statistici di Monte Carlo ):

una variante di Box-Muller

Ora, si può discutere contro questa versione a causa dei variati esponenziali. Ma esiste anche un modo molto intelligente di simulare quei variati senza un richiamo alle funzioni trascendentali , dovuto a von Neumann, come riassunto in questo algoritmo riprodotto dai variati casuali non uniformi di Luc Devroye :

inserisci qui la descrizione dell'immagine

Certo, richiede il calcolo di 1 / e, ma solo una volta.

Se non hai accesso a questo orologio, puoi sostituire questo generatore uniforme con un generatore uniforme meccanico , come lanciare un dardo su una superficie con un gran numero di quadrati di unità(0,1)2 o rotolare una palla su un intervallo di unità (0,1)con abbastanza rimbalzi [come nell'esperimento concettuale del biliardo di Thomas Bayes] o ancora lanciando fiammiferi su un pavimento di legno con assi di larghezza unitaria e contando la distanza fino alla separazione più a sinistra più vicina [come nell'esperimento di Buffon] o ancora per avviare una ruota della roulette con il numero 1 il più basso e trasforma l'angolo risultante di 1 con l'orientamento iniziale in uniforme(0,2π) disegnare.

Utilizzando il CLT alla normalità approssimativa è di certo non è un metodo che avrei mai consigliare come (1) è ancora necessario altro variates per alimentare la media, quindi potrebbe anche utilizzare uniformi nell'algoritmo Box-Müller, e (2) l'accuratezza cresce abbastanza lentamente con il numero di simulazioni. Soprattutto se si utilizza una variabile casuale discreta come il risultato di un dado, anche con più di sei facce . Per citare da Thomas et al. (2007), un sondaggio sui pro e contro dei generatori casuali gaussiani:

Il teorema del limite centrale ovviamente è un esempio di un metodo "approssimativo" - anche se si usa l'aritmetica perfetta, per K finita l'output non sarà gaussiano.

Ecco un breve esperimento per illustrare il problema: ho generato 100 volte la media di 30 esiti di die:

dies=apply(matrix(sample(1:6,30*100,rep=TRUE),ncol=30),1,mean)

poi ha normalizzato quelle medie in varianza zero media variando una

stdies=(dies-3.5)/sqrt(35/12/30)

e esaminato l'adattamento normale [o la mancanza di esso] di questo campione:

qqnorm (stdies, col = "gold2", PCH = 19); abline (a = 0, b = 1, col = "Steelblue", lwd = 2, lty = 2)

In primo luogo, l'adattamento non è eccezionale, specialmente nelle code, e in secondo luogo, piuttosto ovviamente, l'immagine conferma che il numero di valori presi dal campione è imbarazzantemente finito. (In questo particolare esperimento, c'erano solo 34 valori diversi presi da dies, tra 76/30e 122/30.) In confronto, se sfruttassi gli stessi 3000 esiti di dadoDio per creare abbastanza cifre di una pseudo-uniforme come

U=Σio=1KDio-16io
con K=15 (nota che 6¹⁵> 10¹¹, quindi genera più di 11 cifre veramente casuali), quindi applico la suddetta trasformazione di Box-Müller per trasformare coppie di uniformi in coppie di N (0,1) variate,
dies=matrix(apply(matrix(sample(0:5,15*200,rep=TRUE),nrow=15)/6^(1:15),2,sum),ncol=2) 
norma=sqrt(-2*log(dies[,1]))*c(cos(2*pi*dies[,2]),sin(2*pi*dies[,2]))

l'adattamento è buono come ci si può aspettare per un campione normale di dimensione 200 (basta tracciare un altro per un campione normale vero norma=rnorm(100)):

inserisci qui la descrizione dell'immagine

come ulteriormente dimostrato da un test di Kolmogorov-Smirnov:

> ks.test(norma,pnorm)

        One-sample Kolmogorov-Smirnov test

data:  norma
D = 0.06439, p-value = 0.3783
alternative hypothesis: two-sided

3

Questo non è esattamente casuale, ma dovrebbe essere abbastanza vicino, poiché sembra che tu voglia un esperimento approssimativo.

Usa il tuo telefono per configurare un cronometro. Dopo ben 10 secondi, fermalo (Più aspetti, più ti avvicini a un risultato veramente "casuale", ma 10 secondi vanno bene). Prendi le ultime cifre (ad esempio, 10,67 secondi ti daranno 67). Applicare la tabella percentile per la distribuzione normale. In questo esempio, devi solo cercare 0.67 e troverai il numero. In questo caso, il tuo valore è di circa 0,45. Questo non è perfettamente preciso, ma ti darà una stima solida.

Se passi sotto 50, fai solo 100- [Il tuo risultato] e usa la tabella. Il risultato sarà lo stesso, con un segno meno, a causa della simmetria di N (0,1).


3

Lanciamo una moneta imparziale nvolte. A partire da zero, contiamo+1 se esce testa, -1se croce. Dopon lancio della moneta, dividiamo il contatore per n. Utilizzando il teorema del limite centrale , sen è sufficientemente grande, quindi dovremmo avere una "realizzazione approssimativa" del gaussiano normalizzato N(0,1).


Perché? Permettere

XK: ={+1 Se K-th gettone moneta è teste-1 Se K-th gettone moneta è croce

tra le variabili casuali di Bernoulli con P(XK=±1)=12. Quindi,

E(XK)=0Var(XK)=1

Permettere Y: =X1+X2++Xn. Quindi,

E(Y)=0Var(Y)=n

normalizzazione,

Z: =Yn

otteniamo una variabile casuale con varianza unitaria

E(Z)=0Var(Z)=1

1
Come discusso nella mia risposta, temo che il CLT non sia un uso efficiente della casualità nei lanci di monete: sarebbero meglio sfruttati come cifre binarie di una variabile U (0,1) pseudo-casuale con precisione semplice o doppia.
Xi'an,

@ Xi'an Ho letto la tua risposta prima di pubblicare la mia e la tua obiezione al CLT sembrava basarsi su una convergenza lenta. Dato che si tratta di un esperimento mentale, lanciare una moneta 10 miliardi di volte non costa nulla. Ed è veramente una procedura manuale che non richiede computer, nessun calcolo di logaritmi, radici quadrate o coseni. Certo, si potrebbe usare una regola slide, ma potrebbe andare troppo lontano.
Rodrigo de Azevedo,

1
:}}: 10 miliardi di gettoni non mi sembrano molto manuali ...!
Xi'an,

Manuale = a mano. Anche il calcolo manuale di logaritmi e coseni richiede tempo.
Rodrigo de Azevedo,

0

Vale la pena notare che una volta che è possibile generare un'uniforme (0,1), è possibile generare qualsiasi variabile casuale per la quale il cdf inverso è calcolabile semplicemente collegando la variabile casuale uniforme nel CDF inverso.

Quindi, come si può calcolare manualmente un'uniforme (0,1)? Bene, come menzionato da @Silverfish, ci sono una varietà di dadi usati dai tradizionali giocatori di ruolo. Uno dei quali è un dado a dieci facce. Supponendo che questo sia un dado equo, ora possiamo generare un'uniforme discreta (0, 9).

Possiamo anche usare questa uniforme (0,9) per rappresentare una singola cifra di una variabile casuale. Quindi se usiamo due dadi, otteniamo una variabile casuale uniforme che può assumere valori0.01,0.02,...,0.99,1.00. Con tre dadi, possiamo ottenere una distribuzione uniforme su0.001,0.002,...,0,999,1.000.

Quindi possiamo avvicinarci molto a un'uniforme continua (0,1) approssimandola con una distribuzione uniforme discreta finemente grigliata con alcuni dadi a 10 facce. Questo può quindi essere inserito in un CDF inverso per produrre la variabile casuale di interesse.

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.