Generatore di numeri binari casuali online. Generatore di numeri casuali online


Si noti che idealmente la curva di densità di distribuzione dei numeri casuali apparirebbe come mostrata in Fig. 22.3. Cioè, idealmente, ogni intervallo contiene lo stesso numero di punti: N io = N/K , Dove N numero totale di punti, K numero di intervalli, io= 1, , K .

Riso. 22.3. Diagramma di frequenza di numeri casuali,
generato teoricamente da un generatore ideale

Va ricordato che la generazione di un numero casuale arbitrario consiste in due fasi:

  • generare un numero casuale normalizzato (cioè distribuito uniformemente da 0 a 1);
  • conversione di numeri casuali normalizzati R io a numeri casuali X io, che vengono distribuiti secondo la legge di distribuzione (arbitraria) richiesta dall'utente o nell'intervallo richiesto.

I generatori di numeri casuali secondo il metodo per ottenere i numeri sono suddivisi in:

  • fisico;
  • tabellare;
  • algoritmico.

RNG fisico

Un esempio di RNG fisico può essere: una moneta (“testa” 1, “croce” 0); dado; un tamburo con una freccia divisa in settori con numeri; generatore di rumore hardware (HS), che utilizza un dispositivo termico rumoroso, ad esempio un transistor (Fig. 22.422.5).

Riso. 22.4. Schema di un metodo hardware per la generazione di numeri casuali
Riso. 22.5. Schema per ottenere numeri casuali utilizzando il metodo hardware
Compito “Generazione di numeri casuali utilizzando una moneta”

Genera un numero casuale di tre cifre, distribuito uniformemente nell'intervallo da 0 a 1, utilizzando una moneta. Precisione tre cifre decimali.

Il primo modo per risolvere il problema
Lancia una moneta 9 volte e, se esce testa, scrivi "0"; se esce testa, scrivi "1". Quindi, diciamo che come risultato dell'esperimento abbiamo ricevuto la sequenza casuale 100110100.

Disegna un intervallo da 0 a 1. Leggendo i numeri in sequenza da sinistra a destra, dividi l'intervallo a metà e scegli ogni volta una delle parti dell'intervallo successivo (se ottieni uno 0, allora quella di sinistra, se ottieni un 1, poi quello giusto). Pertanto, puoi arrivare a qualsiasi punto dell'intervallo, con la precisione che desideri.

COSÌ, 1 : l'intervallo viene diviso a metà e , viene selezionata la metà destra, l'intervallo viene ridotto: . Numero successivo 0 : l'intervallo viene diviso a metà e , viene selezionata la metà sinistra, l'intervallo viene ridotto: . Numero successivo 0 : l'intervallo viene diviso a metà e , viene selezionata la metà sinistra, l'intervallo viene ridotto: . Numero successivo 1 : l'intervallo viene diviso a metà e , viene selezionata la metà destra, l'intervallo viene ridotto: .

In base alla condizione di accuratezza del problema, è stata trovata una soluzione: è un numero qualsiasi dell'intervallo, ad esempio 0,625.

In linea di principio, se adottiamo un approccio rigoroso, la divisione degli intervalli deve essere continuata fino a quando i limiti sinistro e destro dell'intervallo trovato COINCIDONO con una precisione della terza cifra decimale. Cioè, dal punto di vista della precisione, il numero generato non sarà più distinguibile da qualsiasi numero dell'intervallo in cui si trova.

Il secondo modo per risolvere il problema
Dividiamo la sequenza binaria risultante 100110100 in triadi: 100, 110, 100. Dopo aver convertito questi numeri binari in numeri decimali, otteniamo: 4, 6, 4. Sostituendo "0." davanti, otteniamo: 0,464. Questo metodo può produrre solo numeri da 0,000 a 0,777 (poiché il massimo che può essere “spremuto” da tre cifre binarie è 111 2 = 7 8), cioè, in effetti, questi numeri sono rappresentati nel sistema numerico ottale. Per tradurre ottale numeri dentro decimale eseguiamo la rappresentazione:
0,464 8 = 4 8 1 + 6 8 2 + 4 8 3 = 0,6015625 10 = 0,602 10.
Quindi, il numero richiesto è: 0,602.

RNG tabellare

Gli RNG tabulari utilizzano tabelle appositamente compilate contenenti numeri verificati non correlati, cioè non dipendenti l'uno dall'altro, come fonte di numeri casuali. Nella tabella La Figura 22.1 mostra un piccolo frammento di tale tabella. Percorrendo la tabella da sinistra a destra, dall'alto al basso, si ottengono numeri casuali distribuiti uniformemente da 0 a 1 con il numero di cifre decimali richiesto (nel nostro esempio utilizziamo tre cifre decimali per ogni numero). Poiché i numeri nella tabella non dipendono l'uno dall'altro, la tabella può essere attraversata in diversi modi, ad esempio dall'alto al basso o da destra a sinistra o, ad esempio, è possibile selezionare i numeri che si trovano in posizioni pari.

Tabella 22.1.
Numeri casuali. In modo uniforme
numeri casuali distribuiti da 0 a 1
Numeri casuali Distribuito uniformemente
Da 0 a 1 numeri casuali
9 2 9 2 0 4 2 6 0.929
9 5 7 3 4 9 0 3 0.204
5 9 1 6 6 5 7 6 0.269
… …

Il vantaggio di questo metodo è che produce numeri veramente casuali, poiché la tabella contiene numeri non correlati verificati. Svantaggi del metodo: memorizzare un gran numero di cifre richiede molta memoria; Ci sono grandi difficoltà nel generare e controllare questo tipo di tabelle; le ripetizioni nell'utilizzo di una tabella non garantiscono più la casualità della sequenza numerica, e quindi l'attendibilità del risultato.

C'è una tabella contenente 500 numeri verificati assolutamente casuali (tratti dal libro di I. G. Venetsky, V. I. Venetskaya “Concetti e formule matematici e statistici di base nell'analisi economica”).

RNG algoritmico

I numeri generati da questi RNG sono sempre pseudo-casuali (o quasi-casuali), cioè ogni numero successivo generato dipende da quello precedente:

R io + 1 = F(R io) .

Le sequenze composte da tali numeri formano dei loop, cioè esiste necessariamente un ciclo che si ripete un numero infinito di volte. I cicli ripetuti sono chiamati periodi.

Il vantaggio di questi RNG è la loro velocità; i generatori non richiedono praticamente risorse di memoria e sono compatti. Svantaggi: i numeri non possono essere definiti completamente casuali, poiché esiste una dipendenza tra loro, così come la presenza di periodi nella sequenza di numeri quasi casuali.

Consideriamo diversi metodi algoritmici per ottenere RNG:

  • metodo dei quadrati mediani;
  • metodo dei prodotti medi;
  • metodo di agitazione;
  • metodo della congruenza lineare.

Metodo del quadrato medio

C'è un numero di quattro cifre R 0 . Questo numero viene quadrato e inserito R 1 . Avanti da R 1 prende il nuovo numero casuale centrale (quattro cifre centrali) e lo scrive R 0 . Quindi la procedura viene ripetuta (vedere Fig. 22.6). Tieni presente che in effetti non devi prendere un numero casuale ghij, UN 0.ghij con uno zero e un punto decimale aggiunti a sinistra. Questo fatto si riflette come in Fig. 22.6, e nelle successive figure simili.

Riso. 22.6. Schema del metodo dei quadrati medi

Svantaggi del metodo: 1) se ad alcune iterazioni il numero R 0 diventa uguale a zero, quindi il generatore degenera, quindi è importante la scelta corretta del valore iniziale R 0; 2) il generatore ripeterà la sequenza M N passi (nella migliore delle ipotesi), dove N cifra del numero R 0 , M base del sistema numerico.

Ad esempio nella Fig. 22.6: se il numero R 0 verrà rappresentato nel sistema di numerazione binario, quindi la sequenza di numeri pseudo-casuali verrà ripetuta in 2 4 = 16 passi. Si noti che la ripetizione della sequenza può avvenire prima se il numero iniziale viene scelto male.

Il metodo sopra descritto è stato proposto da John von Neumann e risale al 1946. Poiché questo metodo si è rivelato inaffidabile, è stato rapidamente abbandonato.

Metodo del prodotto medio

Numero R 0 moltiplicato per R 1, dal risultato ottenuto R 2 viene estratta la parte centrale R 2 * (questo è un altro numero casuale) e moltiplicato per R 1 . Tutti i numeri casuali successivi vengono calcolati utilizzando questo schema (vedi Fig. 22.7).

Riso. 22.7. Schema del metodo dei prodotti mediani

Metodo di agitazione

Il metodo shuffle utilizza le operazioni per spostare ciclicamente il contenuto di una cella a sinistra e a destra. L'idea del metodo è la seguente. Lascia che la cella memorizzi il numero iniziale R 0 . Spostando ciclicamente il contenuto della cella verso sinistra di 1/4 della lunghezza della cella, otteniamo un nuovo numero R 0*. Allo stesso modo, ciclando il contenuto della cella R 0 a destra di 1/4 della lunghezza della cella, otteniamo il secondo numero R 0**. Somma di numeri R 0* e R 0** fornisce un nuovo numero casuale R 1 . Ulteriore R 1 è inserito R 0, e l'intera sequenza di operazioni viene ripetuta (vedi Fig. 22.8).


Riso. 22.8. Diagramma del metodo di miscelazione

Si prega di notare che il numero risultante dalla somma R 0* e R 0 ** , potrebbe non rientrare completamente nella cella R 1 . In questo caso, le cifre extra devono essere scartate dal numero risultante. Spieghiamo questo in Fig. 22.8, dove tutte le celle sono rappresentate da otto cifre binarie. Permettere R 0 * = 10010001 2 = 145 10 , R 0 ** = 10100001 2 = 161 10 , Poi R 0 * + R 0 ** = 100110010 2 = 306 10 . Come puoi vedere, il numero 306 occupa 9 cifre (nel sistema numerico binario) e la cella R 1 (uguale a R 0) può contenere un massimo di 8 bit. Pertanto, prima di inserire il valore in R 1, è necessario rimuovere un bit “extra”, più a sinistra, dal numero 306, ottenendo come risultato R 1 non andrà più a 306, ma a 00110010 2 = 50 10 . Si noti inoltre che in linguaggi come Pascal, il "ritaglio" di bit extra quando una cella trabocca viene eseguito automaticamente in base al tipo specificato di variabile.

Metodo della congruenza lineare

Il metodo della congruenza lineare è una delle procedure più semplici e comunemente utilizzate attualmente per simulare numeri casuali. Questo metodo utilizza il mod( X, ) , che restituisce il resto quando il primo argomento viene diviso per il secondo. Ogni numero casuale successivo viene calcolato in base al numero casuale precedente utilizzando la seguente formula:

R io+ 1 = mod( K · R io + B, M) .

Viene chiamata la sequenza di numeri casuali ottenuta utilizzando questa formula sequenza lineare congruente. Molti autori chiamano una successione lineare congruente quando B = 0 metodo moltiplicativo congruente, e quando B ≠ 0 — metodo misto congruente.

Per un generatore di alta qualità, è necessario selezionare coefficienti adeguati. È necessario che il numero M era piuttosto grande, poiché il periodo non può averne di più M elementi. D’altra parte, la divisione utilizzata in questo metodo è un’operazione piuttosto lenta, quindi per un computer binario la scelta logica sarebbe M = 2 N, poiché in questo caso la ricerca del resto della divisione si riduce all'interno del computer all'operazione logica binaria “AND”. È comune anche la scelta del numero primo più grande M, meno di 2 N: nella letteratura specializzata è dimostrato che in questo caso le cifre di ordine basso del numero casuale risultante R io+1 si comportano in modo altrettanto casuale come quelli più vecchi, il che ha un effetto positivo sull'intera sequenza di numeri casuali nel suo insieme. Ad esempio, uno dei Numeri di Mersenne, pari a 2 31 1, e quindi, M= 2 31 1 .

Uno dei requisiti per le sequenze lineari congruenti è che la lunghezza del periodo sia la più lunga possibile. La durata del periodo dipende dai valori M , K E B. Il teorema che presentiamo di seguito ci permette di determinare se è possibile raggiungere un periodo di durata massima per valori specifici M , K E B .

Teorema. Sequenza lineare congruente definita da numeri M , K , B E R 0, ha un periodo di lunghezza M se e solo se:

  • numeri B E M relativamente semplice;
  • K 1 volta P per ogni numero primo P, che è un divisore M ;
  • K 1 è un multiplo di 4, se M multiplo di 4.

Infine, concludiamo con un paio di esempi di utilizzo del metodo della congruenza lineare per generare numeri casuali.

È stato stabilito che una serie di numeri pseudo-casuali generati sulla base dei dati dell'esempio 1 verrebbe ripetuta ogni M/4 numeri. Numero Qè impostato arbitrariamente prima dell'inizio dei calcoli, tuttavia, va tenuto presente che la serie dà l'impressione di essere in generale casuale K(e quindi Q). Il risultato può essere leggermente migliorato se B strano e K= 1 + 4 · Q in questo caso la riga verrà ripetuta ogni M numeri. Dopo una lunga ricerca K i ricercatori si sono stabiliti sui valori di 69069 e 71365.

Un generatore di numeri casuali che utilizza i dati dell'esempio 2 produrrà numeri casuali non ripetitivi con un periodo di 7 milioni.

Il metodo moltiplicativo per generare numeri pseudocasuali fu proposto da D. H. Lehmer nel 1949.

Controllo della qualità del generatore

La qualità dell'intero sistema e l'accuratezza dei risultati dipendono dalla qualità dell'RNG. Pertanto, la sequenza casuale generata dal RNG deve soddisfare una serie di criteri.

I controlli effettuati sono di due tipi:

  • controlli sull'uniformità della distribuzione;
  • test di indipendenza statistica.

Controlla l'uniformità della distribuzione

1) L'RNG dovrebbe produrre valori prossimi ai seguenti parametri statistici caratteristici di una legge casuale uniforme:

2) Prova di frequenza

Un test di frequenza ti consente di scoprire quanti numeri rientrano in un intervallo (M R – σ R ; M R + σ R) , cioè (0,5 0,2887; 0,5 + 0,2887) o, in definitiva, (0,2113; 0,7887). Poiché 0,7887 0,2113 = 0,5774, concludiamo che in un buon RNG, circa il 57,7% di tutti i numeri casuali estratti dovrebbe rientrare in questo intervallo (vedere Figura 22.9).

Riso. 22.9. Diagramma di frequenza di un RNG ideale
in caso di controllo per il test di frequenza

È inoltre necessario tenere conto del fatto che il numero di numeri che rientrano nell'intervallo (0; 0,5) dovrebbe essere approssimativamente uguale al numero di numeri che rientrano nell'intervallo (0,5; 1).

3) Test del chi quadrato

Il test del chi quadrato (test del χ2) è uno dei test statistici più conosciuti; è il metodo principale utilizzato in combinazione con altri criteri. Il test del chi quadrato fu proposto nel 1900 da Karl Pearson. Il suo notevole lavoro è considerato il fondamento della moderna statistica matematica.

Nel nostro caso, il test utilizzando il criterio del chi quadrato ci consentirà di scoprire quanto il vero L'RNG è vicino al benchmark RNG, vale a dire se soddisfa o meno il requisito di distribuzione uniforme.

Diagramma di frequenza riferimento L'RNG è mostrato in Fig. 22.10. Poiché la legge di distribuzione del RNG di riferimento è uniforme, allora la probabilità (teorica). P io inserire i numeri io th intervallo (tutti questi intervalli K) è uguale a P io = 1/K . E così, in ciascuno di K gli intervalli colpiranno liscio Di P io · N numeri ( N numero totale di numeri generati).

Riso. 22.10. Diagramma di frequenza dell'RNG di riferimento

Un vero RNG produrrà numeri distribuiti (e non necessariamente in modo uniforme!) K intervalli e ogni intervallo conterrà N io numeri (in totale N 1 + N 2 + + N K = N ). Come possiamo determinare quanto è buono l'RNG testato e quanto è vicino a quello di riferimento? È abbastanza logico considerare le differenze al quadrato tra il numero di numeri risultante N io e "riferimento" P io · N . Sommiamoli e il risultato è:

χ2 esp. = ( N 1 P 1 · N) 2 + (N 2 P 2 · N) 2 + + ( N K – P K · N) 2 .

Da questa formula segue che quanto più piccola è la differenza in ciascuno dei termini (e quindi quanto più piccolo è il valore di χ 2 exp.), tanto più forte tende ad essere uniforme la legge di distribuzione dei numeri casuali generati da un RNG reale.

Nell'espressione precedente a ciascuno dei termini viene assegnato lo stesso peso (pari a 1), il che di fatto potrebbe non essere vero; pertanto, per le statistiche chi-quadrato, è necessario normalizzarli ciascuno io termine, dividendolo per P io · N :

Infine, scriviamo l’espressione risultante in modo più compatto e semplifichiamola:

Abbiamo ottenuto il valore del test chi quadrato per sperimentale dati.

Nella tabella 22.2 sono dati teorico valori del chi-quadrato (χ 2 teorico), dove ν = N 1 è il numero di gradi di libertà, P questo è un livello di confidenza specificato dall'utente che indica in che misura l'RNG dovrebbe soddisfare i requisiti di una distribuzione uniforme, oppure P — è la probabilità che il valore sperimentale di χ 2 exp. sarà inferiore al χ 2 teorico tabulato (teorico). o uguale ad esso.

Tabella 22.2.
Alcuni punti percentuali della distribuzione χ 2
p = 1% p = 5% p = 25% p = 50% p = 75% p = 95% p = 99%
ν = 1 0.00016 0.00393 0.1015 0.4549 1.323 3.841 6.635
ν = 2 0.02010 0.1026 0.5754 1.386 2.773 5.991 9.210
ν = 3 0.1148 0.3518 1.213 2.366 4.108 7.815 11.34
ν = 4 0.2971 0.7107 1.923 3.357 5.385 9.488 13.28
ν = 5 0.5543 1.1455 2.675 4.351 6.626 11.07 15.09
ν = 6 0.8721 1.635 3.455 5.348 7.841 12.59 16.81
ν = 7 1.239 2.167 4.255 6.346 9.037 14.07 18.48
ν = 8 1.646 2.733 5.071 7.344 10.22 15.51 20.09
ν = 9 2.088 3.325 5.899 8.343 11.39 16.92 21.67
ν = 10 2.558 3.940 6.737 9.342 12.55 18.31 23.21
ν = 11 3.053 4.575 7.584 10.34 13.70 19.68 24.72
ν = 12 3.571 5.226 8.438 11.34 14.85 21.03 26.22
ν = 15 5.229 7.261 11.04 14.34 18.25 25.00 30.58
ν = 20 8.260 10.85 15.45 19.34 23.83 31.41 37.57
ν = 30 14.95 18.49 24.48 29.34 34.80 43.77 50.89
ν = 50 29.71 34.76 42.94 49.33 56.33 67.50 76.15
ν > 30 ν +qrt(2 ν ) · X P+ 2/3 · X 2 P 2/3+ O(1/quadrato( ν ))
X P = 2.33 1.64 0,674 0.00 0.674 1.64 2.33

Considerato accettabile P dal 10% al 90%.

Se χ 2 esp. molto più della teoria del χ2. (questo è Pè grande), quindi il generatore non soddisfa il requisito della distribuzione uniforme, a partire dai valori osservati N io andare troppo lontano dal teorico P io · N e non può essere considerato casuale. In altre parole, viene stabilito un intervallo di confidenza così ampio che le restrizioni sui numeri diventano molto allentate, i requisiti sui numeri diventano deboli. In questo caso, si osserverà un errore assoluto molto grande.

Anche D. Knuth nel suo libro “The Art of Programming” ha notato che avendo χ 2 exp. per i piccoli, in generale, non va bene nemmeno, anche se questo sembra, a prima vista, meraviglioso dal punto di vista dell'uniformità. Infatti, prendiamo una serie di numeri 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, sono ideali dal punto di vista dell'uniformità, e χ 2 esp. saranno praticamente zero, ma difficilmente li riconoscerete come casuali.

Se χ 2 esp. molto meno della teoria del χ2. (questo è P piccolo), quindi il generatore non soddisfa il requisito di una distribuzione casuale uniforme, a partire dai valori osservati N io troppo vicino al teorico P io · N e non può essere considerato casuale.

Ma se χ 2 esp. si trova in un certo intervallo tra due valori di χ 2 o. , che corrispondono, ad esempio, P= 25% e P= 50%, allora possiamo supporre che i valori dei numeri casuali generati dal sensore siano completamente casuali.

Inoltre, va tenuto presente che tutti i valori P io · N deve essere abbastanza grande, ad esempio più di 5 (scoperto empiricamente). Solo allora (con un campione statistico sufficientemente ampio) le condizioni sperimentali potranno essere considerate soddisfacenti.

Pertanto, la procedura di verifica è la seguente.

Test di indipendenza statistica

1) Controllare la frequenza di occorrenza dei numeri nella sequenza

Diamo un'occhiata a un esempio. Il numero casuale 0.2463389991 è composto dalle cifre 2463389991, mentre il numero 0.5467766618 è composto dalle cifre 5467766618. Collegando le sequenze di cifre, abbiamo: 24633899915467766618.

È chiaro che la probabilità teorica P io perdita io L'esima cifra (da 0 a 9) è pari a 0,1.

2) Controllare l'aspetto di serie di numeri identici

Indichiamo con N l numero di serie di cifre identiche in una riga di lunghezza l. Tutto deve essere controllato l da 1 a M, Dove M questo è un numero specificato dall'utente: il numero massimo di cifre identiche presenti in una serie.

Nell’esempio “24633899915467766618” sono state trovate 2 serie di lunghezza 2 (33 e 77), ovvero N 2 = 2 e 2 serie di lunghezza 3 (999 e 666), cioè N 3 = 2 .

La probabilità che si verifichi una serie di lunghezza lè uguale a: P l= 9 10 l (teorico). Cioè, la probabilità che si verifichi una serie lunga un carattere è uguale a: P 1 = 0,9 (teorico). La probabilità che appaia una serie di due caratteri è: P 2 = 0,09 (teorico). La probabilità che appaia una serie di tre caratteri è: P 3 = 0,009 (teorico).

Ad esempio, la probabilità che si verifichi una serie lunga un carattere è P l= 0,9, poiché può esserci un solo simbolo su 10 e ci sono 9 simboli in totale (lo zero non conta). E la probabilità che due simboli identici “XX” appaiano in fila è 0,1 · 0,1 · 9, cioè la probabilità di 0,1 che il simbolo “X” appaia in prima posizione è moltiplicata per la probabilità di 0,1 che il simbolo “X” appaia in prima posizione lo stesso simbolo apparirà nella seconda posizione “X” e moltiplicato per il numero di tali combinazioni 9.

La frequenza di occorrenza delle serie viene calcolata utilizzando la formula del chi quadrato di cui abbiamo discusso in precedenza utilizzando i valori P l .

Nota: il generatore può essere testato più volte, ma i test non sono completi e non garantiscono che il generatore produca numeri casuali. Ad esempio, un generatore che produce la sequenza 12345678912345 sarà considerato ideale durante i test, il che ovviamente non è del tutto vero.

In conclusione, notiamo che il terzo capitolo del libro di Donald E. Knuth The Art of Programming (Volume 2) è interamente dedicato allo studio dei numeri casuali. Esamina vari metodi per generare numeri casuali, test statistici di casualità e conversione di numeri casuali distribuiti uniformemente in altri tipi di variabili casuali. Più di duecento pagine sono dedicate alla presentazione di questo materiale.

  • Esercitazione

Ti sei mai chiesto come funziona Math.random()? Cos'è un numero casuale e come si ottiene? Immagina una domanda per un'intervista: scrivi il tuo generatore di numeri casuali in un paio di righe di codice. Allora, cos'è un incidente ed è possibile prevederlo?

Sono molto affascinato dai vari enigmi e compiti IT e il generatore di numeri casuali è uno di questi compiti. Di solito nel mio canale Telegram analizzo tutti i tipi di enigmi e vari compiti delle interviste. Il problema del generatore di numeri casuali ha guadagnato una grande popolarità e ho voluto perpetuarlo nel profondo di una delle autorevoli fonti di informazione, cioè qui su Habré.

Questo materiale sarà utile a tutti quegli sviluppatori front-end e Node.js che sono all'avanguardia della tecnologia e vogliono entrare in un progetto/startup blockchain, dove anche agli sviluppatori front-end vengono poste domande su sicurezza e crittografia, a almeno a livello base.

Generatore di numeri pseudo-casuali e generatore di numeri casuali

Per ottenere qualcosa di casuale, abbiamo bisogno di una fonte di entropia, una fonte di caos da cui utilizzeremo per generare casualità.

Questa fonte viene utilizzata per accumulare entropia e quindi ottenere da essa un valore iniziale (seme), necessario ai generatori di numeri casuali (RNG) per generare numeri casuali.

Il generatore di numeri pseudo-casuali utilizza un singolo seme, da qui la sua pseudo-casualità, mentre il generatore di numeri casuali genera sempre un numero casuale iniziando con una variabile casuale di alta qualità estratta da varie fonti di entropia.

L’entropia è una misura del disordine. L’entropia dell’informazione è una misura dell’incertezza o imprevedibilità delle informazioni.
Si scopre che per creare una sequenza pseudo-casuale abbiamo bisogno di un algoritmo che generi una determinata sequenza in base a una determinata formula. Ma una tale sequenza può essere prevista. Tuttavia, immaginiamo come potremmo scrivere il nostro generatore di numeri casuali se non avessimo Math.random()

PRNG ha qualche algoritmo che può essere riprodotto.
RNG è il processo per ottenere numeri interamente da qualche tipo di rumore, la capacità di calcolo che tende a zero. Allo stesso tempo, l’RNG dispone di determinati algoritmi per equalizzare la distribuzione.

Creiamo il nostro algoritmo PRNG

Il generatore di numeri pseudocasuali (PRNG) è un algoritmo che genera una sequenza di numeri i cui elementi sono quasi indipendenti gli uni dagli altri e obbediscono ad una determinata distribuzione (solitamente uniforme).
Possiamo prendere una sequenza di alcuni numeri e ricavarne il modulo. L'esempio più semplice che mi viene in mente. Dobbiamo pensare a quale sequenza prendere e il modulo da cosa. Se passi direttamente da 0 a N e modulo 2, ottieni un generatore di 1 e 0:

Funzione* rand() ( const n = 100; const mod = 2; let i = 0; while (true) ( ​​yield i % mod; if (i++ > n) i = 0; ) ) let i = 0; for (let x di rand()) ( if (i++ > 100) break; console.log(x); )
Questa funzione genera la sequenza 01010101010101... e non può nemmeno essere definita pseudo-casuale. Affinché un generatore sia casuale, deve superare il test del bit successivo. Ma non abbiamo questo compito. Tuttavia anche senza alcun test possiamo prevedere la sequenza successiva, il che significa che un simile algoritmo non è adatto, ma siamo nella giusta direzione.

E se prendessimo una sequenza ben nota ma non lineare, ad esempio il numero PI. E come valore per il modulo non prenderemo 2, ma qualcos'altro. Puoi anche pensare al cambiamento del valore del modulo. La sequenza di cifre in Pi è considerata casuale. Il generatore può funzionare utilizzando i numeri Pi a partire da un punto sconosciuto. Un esempio di tale algoritmo, con una sequenza basata su PI e un modulo variabile:

Vettore cost = [...Math.PI.toFixed(48).replace(".","")]; funzione* rand() ( for (let i=3; i<1000; i++) { if (i >99) i = 2; per (sia n=0; n Ma in JS, il numero PI può essere visualizzato solo fino a 48 cifre e non di più. Pertanto, è ancora facile prevedere tale sequenza e ogni esecuzione di tale generatore produrrà sempre gli stessi numeri. Ma il nostro generatore ha già iniziato a mostrare i numeri da 0 a 9.

Abbiamo un generatore di numeri da 0 a 9, ma la distribuzione è molto disomogenea e genererà ogni volta la stessa sequenza.

Possiamo prendere non il numero Pi, ma il tempo nella rappresentazione numerica e considerare questo numero come una sequenza di numeri e, per garantire che la sequenza non si ripeta ogni volta, la leggeremo dalla fine. In totale, il nostro algoritmo per il nostro PRNG sarà simile al seguente:

Funzione* rand() ( let newNumVettore = () => [...(+nuova data)+""].reverse(); let vettore = newNumVettore(); let i=2; while (true) ( ​​​​se (i++ > 99) i = 2; sia n=-1; mentre (++n< vector.length) yield (vector[n] % i); vector = newNumVector(); } } // TEST: let i = 0; for (let x of rand()) { if (i++ >100) pausa; console.log(x)
Sembra già un generatore di numeri pseudo-casuali. E lo stesso Math.random() è un PRNG, ne parleremo poco dopo. Inoltre, ogni volta otteniamo un primo numero diverso.

In realtà, utilizzando questi semplici esempi puoi capire come funzionano i generatori di numeri casuali più complessi. E ci sono anche algoritmi già pronti. Ad esempio, diamo un'occhiata a uno di questi — questo è il PRNG lineare congruente (LCPRNG).

PRNG lineare congruente

Il PRNG congruente lineare (LCPRNG) è un metodo comune per generare numeri pseudocasuali. Non è crittograficamente forte. Questo metodo consiste nel calcolare i termini di una successione lineare ricorrente modulo un numero naturale m, dato dalla formula. La sequenza risultante dipende dalla scelta del numero iniziale — i.e. seme. Con diversi valori di seme si ottengono diverse sequenze di numeri casuali. Un esempio di implementazione di tale algoritmo in JavaScript:

Cost a = 45; cost c = 21; cost m = 67; var seme = 2; const rand = () => seme = (a*seme + c) % m; for(sia i=0; i<30; i++) console.log(rand())
Molti linguaggi di programmazione utilizzano LCPRNG (ma non esattamente questo algoritmo(!)).

Come accennato in precedenza, tale sequenza può essere prevista. Allora perché abbiamo bisogno del PRNG? Se parliamo di sicurezza, il PRNG è un problema. Se parliamo di altri compiti, queste proprietà possono essere un vantaggio. Ad esempio, per vari effetti speciali e animazioni grafiche, potrebbe essere necessario chiamare frequentemente casuale. Ed è qui che la distribuzione dei significati e la performance sono importanti! Gli algoritmi sicuri non possono vantare velocità.

Un'altra proprietà è la riproducibilità. Alcune implementazioni permettono di specificare un seed, e questo è molto utile se la sequenza deve essere ripetuta. La riproduzione è necessaria, ad esempio, nei test. E ci sono molte altre cose che non richiedono un RNG sicuro.

Come funziona Math.random()

Il metodo Math.random() restituisce un numero in virgola mobile pseudo-casuale dall'intervallo = crypto.getRandomValues(new Uint8Array(1)); console.log(rvalore)
Ma, a differenza del PRNG Math.random(), questo metodo richiede molte risorse. Il fatto è che questo generatore utilizza chiamate di sistema nel sistema operativo per accedere alle fonti di entropia (indirizzo mac, CPU, temperatura, ecc...).

Varie lotterie, concorsi a premi, ecc. si svolgono spesso in molti gruppi o pagine pubbliche sui social network, Instagram, ecc. e vengono utilizzate dai proprietari di account per attirare nuovo pubblico nella comunità.

Il risultato di tali estrazioni dipende spesso dalla fortuna dell'utente, poiché il destinatario del premio viene determinato in modo casuale.

Per effettuare questa determinazione, gli organizzatori della lotteria utilizzano quasi sempre un generatore di numeri casuali online o preinstallato distribuito gratuitamente.

Scelta

Molto spesso, la scelta di un generatore del genere può essere difficile, poiché la loro funzionalità è abbastanza diversa: per alcuni è significativamente limitata, per altri è piuttosto ampia.

Viene implementato un numero piuttosto elevato di tali servizi, ma la difficoltà è che differiscono nella portata.

Molti, ad esempio, sono legati per la loro funzionalità a uno specifico social network (ad esempio, molte applicazioni di generazione su VKontakte funzionano solo con collegamenti da questo social network).

I generatori più semplici determinano semplicemente in modo casuale un numero all'interno di un determinato intervallo.

Questo è comodo perché non associa il risultato a un post specifico, il che significa che può essere utilizzato per concorsi a premi al di fuori del social network e in varie altre situazioni.

Essenzialmente non hanno altro uso.

<Рис. 1 Генератор>

Consiglio! Quando si sceglie il generatore più adatto è importante considerare a cosa servirà.

Specifiche

Per un processo più rapido di scelta del servizio online ottimale per la generazione di numeri casuali, la tabella seguente mostra le principali caratteristiche tecniche e funzionalità di tali applicazioni.

Tabella 1. Caratteristiche del funzionamento delle applicazioni online per la generazione di un numero casuale
Nome Rete sociale Risultati multipli Selezionare da un elenco di numeri Widget online per il sito Selezionare da un intervallo Disabilitare le ripetizioni
RandStuff NO NO
Tirare a sorte Sito ufficiale o VKontakte NO NO
Numero casuale Sito ufficiale NO NO NO
Randomus Sito ufficiale NO NO NO
Numeri casuali Sito ufficiale NO NO NO NO

Tutte le applicazioni discusse nella tabella sono descritte più dettagliatamente di seguito.

<Рис. 2 Случайные числа>

RandStuff

<Рис. 3 RandStuff>

Puoi utilizzare questa applicazione online seguendo il collegamento al suo sito Web ufficiale http://randstuff.ru/number/.

Questo è un semplice generatore di numeri casuali, caratterizzato da un funzionamento veloce e stabile.

È implementato con successo sia nel formato di un'applicazione indipendente separata sul sito Web ufficiale, sia come applicazione sul social network VKontakte.

La particolarità di questo servizio è che può selezionare un numero casuale sia da un intervallo specificato che da un elenco specifico di numeri che è possibile specificare sul sito.

Professionisti:

  • Lavoro stabile e veloce;
  • Mancanza di connessione diretta a un social network;
  • È possibile selezionare uno o più numeri;
  • Puoi scegliere solo tra i numeri specificati.

Aspetti negativi:

  • Impossibilità di condurre un'estrazione VKontakte (questo richiede un'applicazione separata);
  • Le applicazioni per VKontakte non funzionano in tutti i browser;
  • Il risultato a volte sembra prevedibile perché viene utilizzato un solo algoritmo di calcolo.

Le recensioni degli utenti su questa applicazione sono le seguenti: “Determiniamo i vincitori nei gruppi VKontakte attraverso questo servizio. Grazie”, “Sei il migliore”, “Utilizzo solo questo servizio”.

Tirare a sorte

<Рис. 4 Cast Lots>

Questa applicazione è un semplice generatore di funzioni, implementato sul sito ufficiale sotto forma di applicazione VKontakte.

C'è anche un widget generatore da inserire nel tuo sito web.

La differenza principale rispetto all'applicazione descritta in precedenza è che questa consente di disattivare la ripetizione del risultato.

Cioè, quando si eseguono più generazioni di seguito in una sessione, il numero non verrà ripetuto.

  • Disponibilità di un widget da inserire in un sito web o blog;
  • Possibilità di disabilitare la ripetizione dei risultati;
  • La presenza della funzione “ancora più casualità”, dopo l'attivazione della quale cambia l'algoritmo di selezione.

Negativo:

  • Incapacità di determinare più risultati contemporaneamente;
  • Impossibilità di selezionare da un elenco specifico di numeri;
  • Per selezionare un vincitore tra i pubblici, è necessario utilizzare un widget VKontakte separato.

Le recensioni degli utenti sono le seguenti: "Funziona stabilmente, è abbastanza comodo da usare", "Funzionalità comoda", "Uso solo questo servizio".

Numero casuale

<Рис. 5 Случайное число>

Questo servizio si trova su http://randomnumber.rf/.

Generatore semplice con funzioni minime e caratteristiche aggiuntive.

Può generare casualmente numeri entro un intervallo specificato (massimo da 1 a 99999).

Il sito non ha alcuna veste grafica e quindi la pagina si carica facilmente.

Il risultato può essere copiato o scaricato con un clic di un pulsante.

Negativo:

  • Mancanza di un widget per VKontakte;
  • Non è possibile effettuare pareggi;
  • Non è possibile incorporare il risultato in un blog o un sito Web.

Ecco cosa dicono gli utenti di questo servizio: "Un buon generatore, ma poche funzioni", "Pochissime funzionalità", "Adatto per generare rapidamente numeri senza impostazioni non necessarie".

Randomus

<Рис. 6 Рандомус>

Puoi utilizzare questo generatore di numeri casuali su http://randomus.ru/.

Un altro, abbastanza semplice, ma generatore funzionale di numeri casuali.

Il servizio ha funzionalità sufficienti per determinare numeri casuali, ma non è adatto per lo svolgimento di concorsi a premi e altri processi più complessi.

Negativo:

  • Impossibilità di trattenere disegni basati su repost di un post, ecc.
  • Non esiste un'applicazione per VKontakte o un widget per il sito;
  • Non è possibile disabilitare la ripetizione dei risultati.

Un generatore di numeri online chiaro e conveniente, diventato recentemente popolare. È diventato più diffuso durante le estrazioni a premi sui social network tra gli utenti.

È popolare anche in altre zone. Abbiamo anche password e numeri.

Il nostro generatore di numeri casuali online.

Il nostro generatore di randomizzazione non richiede il download sul tuo PC personale. Tutto avviene in modalità generatore di numeri online. Basta specificare parametri come: intervallo di numeri online in cui i numeri verranno selezionati casualmente. Indicare anche il numero di numeri che verranno selezionati.

Ad esempio, hai un gruppo VKontakte. Nel gruppo vincerai 5 premi tra il numero di partecipanti che ripubblicheranno il post. Utilizzando un'applicazione speciale, abbiamo ricevuto un elenco dei partecipanti. A ciascuno è stato assegnato il proprio numero di serie per i numeri online.

Ora andiamo al nostro generatore online e indichiamo l'intervallo di numeri (numero di partecipanti). Ad esempio, impostiamo che online siano necessari 5 numeri, poiché abbiamo 5 premi. Ora fai clic sul pulsante Genera. Quindi otteniamo 5 numeri casuali online, che vanno da 1 a 112 compreso. I 5 numeri generati online corrisponderanno al numero di serie dei cinque partecipanti che sono diventati vincitori dell'estrazione. Tutto è semplice e conveniente.

Un altro vantaggio del generatore di numeri casuali è che tutti i numeri online vengono emessi in modo casuale. Cioè, non è possibile influenzarlo o calcolare quale sarà il prossimo numero. Cosa significa onesto e affidabile, e l'amministrazione, che assegna i premi utilizzando il nostro generatore gratuito, è onesta e dignitosa nella persona dei partecipanti al concorso. E se hai dubbi su qualsiasi decisione, puoi utilizzare il nostro

Perché il generatore di numeri casuali è il migliore?

Il fatto è che generatore di numeri online disponibile su qualsiasi dispositivo e sempre online. Puoi onestamente generare qualsiasi numero per qualsiasi idea tu abbia. E usa lo stesso per il progetto generatore di numeri casuali in linea. Soprattutto se devi determinare il vincitore di un gioco o di un altro numero online. Il fatto è che generatore di numeri casuali genera qualsiasi numero in modo completamente casuale senza algoritmi. Fondamentalmente è lo stesso che per i numeri.

Generatore di numeri casuali online gratis!

Generatore di numeri casuali online gratuito per tutti. Non è necessario scaricarne o acquistarne alcuno generatore di numeri casuali on-line per l'estrazione. Devi solo andare sul nostro sito Web e ottenere il risultato casuale di cui hai bisogno. Non solo abbiamo generatore di numeri casuali ma anche necessario a molti e ti aiuterà sicuramente a vincere alla lotteria. Un vero generatore di numeri casuali online per le lotterie è la casualità assoluta. Che il nostro sito è in grado di fornirti.

Numero casuale online

Se stai cercando un numero casuale online, abbiamo creato questa risorsa apposta per te. Miglioriamo costantemente i nostri algoritmi. Otterrai quello vero qui generatore di numeri casuali. Fornirà qualsiasi esigenza come il generatore casuale di cui hai bisogno in modo completamente gratuito e in qualsiasi momento. Genera numeri casuali online con noi. Assicurati sempre che ogni numero generato sia completamente casuale.

Generatore di numeri casuali

Il nostro generatore di numeri casuali seleziona casualmente i numeri in modo completamente casuale. Non importa che giorno o ora hai sul tuo computer. Questa è una vera scelta cieca. Il generatore casuale mescola semplicemente tutti i numeri in ordine casuale. E poi seleziona casualmente il numero di numeri casuali specificati da essi. A volte i numeri possono essere ripetuti, il che dimostra la completa casualità del generatore di numeri casuali.

Casuale in linea

Il caso è l'opzione più sicura per un pareggio. Il generatore online è davvero una scelta casuale. Sei protetto da qualsiasi influenza sulla selezione di un numero casuale. Filmando in video il processo di selezione casuale online del vincitore. Questo è tutto ciò di cui hai bisogno. Organizza estrazioni fieristiche online con il nostro generatore di numeri online. Ottieni vincitori e giocatori soddisfatti. E siamo lieti di essere riusciti a soddisfarti con il nostro generatore casuale.

Abbiamo una sequenza di numeri costituita da elementi praticamente indipendenti che obbediscono ad una determinata distribuzione. Di regola, distribuzione uniforme.

Puoi generare numeri casuali in Excel in diversi modi e modi. Consideriamo solo i migliori.

Funzione numero casuale in Excel

  1. La funzione RAND restituisce un numero reale casuale e uniformemente distribuito. Sarà inferiore a 1, maggiore o uguale a 0.
  2. La funzione RANDBETWEEN restituisce un numero intero casuale.

Vediamo il loro utilizzo con degli esempi.

Campionamento di numeri casuali utilizzando RAND

Questa funzione non richiede argomenti (RAND()).

Per generare un numero reale casuale compreso tra 1 e 5, ad esempio, utilizzare la seguente formula: =RAND()*(5-1)+1.

Il numero casuale restituito viene distribuito uniformemente nell'intervallo.

Ogni volta che viene calcolato il foglio di lavoro o cambia il valore in qualsiasi cella del foglio di lavoro, viene restituito un nuovo numero casuale. Se vuoi salvare la popolazione generata, puoi sostituire la formula con il suo valore.

  1. Fare clic sulla cella con un numero casuale.
  2. Nella barra della formula selezionare la formula.
  3. Premi F9. ED ENTRA.

Controlliamo l'uniformità della distribuzione dei numeri casuali del primo campione utilizzando un istogramma di distribuzione.


L'intervallo di valori verticali è la frequenza. Orizzontale - "tasche".



Funzione CASUALETRA

La sintassi per la funzione RANDBETWEEN è (limite inferiore; limite superiore). Il primo argomento deve essere minore del secondo. Altrimenti la funzione genererà un errore. Si presuppone che i confini siano numeri interi. La formula scarta la parte frazionaria.

Esempio di utilizzo della funzione:

Numeri casuali con precisione 0,1 e 0,01:

Come creare un generatore di numeri casuali in Excel

Creiamo un generatore di numeri casuali che generi un valore da un determinato intervallo. Usiamo una formula come: =INDEX(A1:A10,INTEGER(RAND()*10)+1).

Creiamo un generatore di numeri casuali nell'intervallo da 0 a 100 in passi di 10.

È necessario selezionarne 2 casuali dall'elenco dei valori di testo. Utilizzando la funzione RAND, confrontiamo i valori di testo nell'intervallo A1:A7 con numeri casuali.

Usiamo la funzione INDICE per selezionare due valori di testo casuali dall'elenco originale.

Per selezionare un valore casuale dall'elenco, utilizzare la formula seguente: =INDEX(A1:A7,RANDBETWEEN(1,COUNT(A1:A7))).

Generatore di numeri casuali a distribuzione normale

Le funzioni CASUALE e CASUALE TRA producono numeri casuali con una distribuzione uniforme. Qualsiasi valore con la stessa probabilità può rientrare nel limite inferiore dell'intervallo richiesto e in quello superiore. Ciò si traduce in un enorme spread rispetto al valore target.

Una distribuzione normale implica che la maggior parte dei numeri generati siano vicini al numero target. Regoliamo la formula RANDBETWEEN e creiamo un array di dati con una distribuzione normale.

Il costo del prodotto X è di 100 rubli. L'intero lotto prodotto segue una distribuzione normale. Anche una variabile casuale segue una distribuzione di probabilità normale.

In tali condizioni, il valore medio dell'intervallo è di 100 rubli. Generiamo un array e costruiamo un grafico con una distribuzione normale con una deviazione standard di 1,5 rubli.

Usiamo la funzione: =NORMINV(RAND();100;1.5).

Excel ha calcolato quali valori rientravano nell'intervallo di probabilità. Poiché la probabilità di produrre un prodotto con un costo di 100 rubli è massima, la formula mostra valori vicini a 100 più spesso di altre.

Passiamo alla tracciatura del grafico. Per prima cosa devi creare una tabella con le categorie. Per fare ciò, dividiamo l'array in periodi:

Sulla base dei dati ottenuti, possiamo generare un diagramma con una distribuzione normale. L'asse dei valori è il numero di variabili nell'intervallo, l'asse delle categorie sono i periodi.