Un Generatore casuale è uno strumento o un algoritmo che produce risultati imprevedibili e non deterministici. Questi generatori sono essenziali in molti settori, dalla crittografia alla simulazione informatica.
- Risultati imprevedibili: I generatori casuali forniscono risultati che non possono essere previsti.
- Utilizzo in crittografia: Sono fondamentali per una comunicazione sicura.
- Simulazioni al computer: Spesso utilizzato nella modellazione e nell'analisi di sistemi complessi.
Generatore di numeri casuali
Come funziona un generatore di numeri casuali? ?
I generatori casuali funzionano con processi fisici o algoritmi matematici. I tipi più importanti sono i generatori di numeri casuali veri (TRNG) e i generatori di numeri pseudocasuali (PRNG).
Dove si gioca a blackjack online?
Abbiamo avuto le migliori esperienze al Black Jack nella Playamo Casinò dal vivo fatto. A mio parere, è proprio questo il punto di partenza, MIGLIORE SELEZIONE ai tavoli con croupier dal vivo e puoi allenarti molto bene per il casinò reale! Rispetto ad altri casinò online, le vincite su Playamo sono davvero pagate e per questo motivo consiglio vivamente il casinò online Playamo!
Il Casinò Playamo dispone di numerosi tavoli dal vivo per il blackjack e di una Pagamento rapido di Vinci.
Le varie applicazioni della casualità hanno portato allo sviluppo di diversi metodi per generare dati casuali. Alcuni di questi esistono fin dall'antichità e comprendono esempi ben noti come il lancio dei dadi, il lancio delle monete, il mescolamento delle carte da gioco, l'uso dei gambi di achillea (per la divinazione) nell'I Ching e innumerevoli altre tecniche. A causa della natura meccanica di queste tecniche, la generazione di grandi quantità di numeri sufficientemente casuali (importanti in statistica) richiedeva molto lavoro e tempo. Pertanto, i risultati venivano talvolta raccolti e distribuiti sotto forma di tabelle di numeri casuali.
Esistono diversi metodi computazionali per generare numeri pseudorandom. Tutti non riescono a raggiungere l'obiettivo di una vera casualità, anche se soddisfano, con diversi gradi di successo, alcuni dei criteri statistici che caratterizzano i numeri pseudocasuali. Test per la casualità, che sono progettati per misurare quanto siano imprevedibili i loro risultati (cioè fino a che punto i loro schemi sono riconoscibili). Questo li rende generalmente inutilizzabili per applicazioni come la crittografia. Tuttavia, esistono anche generatori di numeri pseudorandom sicuri dal punto di vista crittografico (CSPRNGS) con caratteristiche speciali studiate appositamente per la crittografia. Inserire sono stati sviluppati nella crittografia.
Applicazioni dei generatori casuali
- Giochi e intrattenimento:
- I generatori casuali sono utilizzati nei giochi per creare elementi imprevedibili come i lanci di dadi, le estrazioni di carte o la generazione di livelli.
- Crittografia:
- Nella sicurezza delle informazioni, i generatori di numeri casuali sono fondamentali per la generazione di chiavi, sali e nonci, necessari per la crittografia e l'autenticazione.
- Statistiche e campioni:
- Quando si creano campioni per sondaggi e studi, i generatori casuali aiutano ad estrarre campioni rappresentativi e imparziali.
- Modelli di simulazione:
- Nella scienza e nella tecnologia, i generatori di numeri casuali sono utilizzati per eseguire simulazioni Monte Carlo che utilizzano variabili casuali per modellare e analizzare sistemi complessi.
- Lotterie e concorsi:
- Assicurano una selezione equa e casuale dei vincitori di lotterie, concorsi a premi e altre competizioni.
- Algoritmi di ottimizzazione:
- I metodi casuali, come gli algoritmi genetici e la ricottura simulata, utilizzano generatori casuali per cercare in modo efficiente gli spazi di soluzione e trovare soluzioni ottimali.
- Intelligenza artificiale e apprendimento automatico Apprendimento:
- I generatori casuali vengono utilizzati per mescolare i set di dati e selezionare in modo casuale i dati di addestramento e di prova per convalidare e addestrare i modelli.
I generatori di numeri casuali trovano applicazione in Gioco d'azzardonel campionamento statistico, nella simulazione informatica, nella crittografia, nella progettazione completamente randomizzata e in altre aree in cui è auspicabile la generazione di un risultato imprevedibile. In generale, nelle applicazioni in cui l'imprevedibilità è la caratteristica principale, come ad esempio le applicazioni di sicurezza, i generatori hardware sono preferiti, ove possibile.
I generatori di numeri pseudorandom sono molto utili nello sviluppo di metodi di simulazione Monte Carlo, in quanto il debugging è facilitato dalla possibilità di ripetere la stessa sequenza di numeri casuali partendo dallo stesso seme casuale. Sono utilizzati anche in crittografia, a patto che il seme rimanga segreto. Il mittente e il destinatario possono generare automaticamente lo stesso insieme di numeri da utilizzare come chiave.
La generazione di numeri pseudorandom è un compito importante e comune nella programmazione dei computer. Mentre la crittografia e alcuni algoritmi numerici richiedono un grado molto elevato di casualità apparente, molte altre operazioni richiedono solo un grado modesto di imprevedibilità. Alcuni semplici esempi possono essere la presentazione a un utente di una "citazione casuale del giorno" o la determinazione della direzione in cui potrebbe muoversi un avversario controllato dal computer in un gioco. Forme più deboli di casualità sono utilizzate negli algoritmi di hashing e nella creazione di algoritmi di ricerca e ordinamento ammortizzati.
Alcune applicazioni che a prima vista sembrano adatte alla randomizzazione, in realtà non sono così semplici. Ad esempio, un sistema che "randomizza" le tracce musicali per un sistema di musica di sottofondo deve solo apparire in modo casuale e può anche avere modi di controllare la selezione della musica: un sistema veramente randomizzato non avrebbe alcuna restrizione nel far apparire lo stesso brano due o tre volte di seguito.
Numeri casuali reali e numeri pseudo-casuali ?
La differenza tra numeri reali e pseudocasuali sta nella prevedibilità e nella fonte della casualità.
- Numeri casuali reali: Imprevedibile, basato su processi fisici.
- Numeri pseudocasuali: Generati da algoritmi, prevedibili se il seme è noto.
Esistono due metodi principali per generare numeri casuali. Il primo metodo misura un fenomeno fisico considerato casuale e poi compensa le possibili distorsioni nel processo di misurazione. Esempi di sorgenti sono la misurazione del rumore atmosferico, del rumore termico e di altri fenomeni esterni elettromagnetici e quantomeccanici. Ad esempio, la radiazione cosmica di fondo o il decadimento radioattivo misurato su brevi periodi di tempo sono fonti di entropia naturale (come misura dell'imprevedibilità o della sorpresa del processo di generazione dei numeri).
La velocità di estrazione dell'entropia dalle fonti naturali dipende dai fenomeni fisici sottostanti che vengono misurati. Per questo motivo, le fonti di entropia "vera" presenti in natura sono dette bloccanti: la loro velocità è limitata fino a quando non viene raccolta una quantità di entropia sufficiente a soddisfare la domanda. In alcuni sistemi Unix-like, tra cui la maggior parte delle distribuzioni Linux, lo pseudo file di dispositivo /dev/random si blocca finché non viene raccolta entropia sufficiente dall'ambiente. A causa di questo comportamento di blocco, la lettura di grandi quantità di dati da /dev/random, come il riempimento di un disco rigido con bit casuali, può essere spesso lenta sui sistemi che utilizzano questo tipo di fonte di entropia.
Il secondo metodo utilizza algoritmi di calcolo in grado di generare lunghe sequenze di risultati apparentemente casuali che in realtà sono completamente determinati da un valore iniziale più breve, noto come valore seme o chiave. Ciò consente di riprodurre l'intera sequenza apparentemente casuale se il valore seme è noto. Questo tipo di generatore di numeri casuali viene spesso definito generatore di numeri pseudorandom. Questo tipo di generatore di solito non è bloccante, quindi non è limitato da un evento esterno, consentendo la lettura di grandi quantità di dati.
Alcuni sistemi utilizzano un approccio ibrido che raccoglie casualità da fonti naturali, quando disponibili, e si affida a generatori di numeri pseudorandom crittograficamente sicuri (CSPRNG) che vengono periodicamente riseminati quando il tasso di lettura desiderato supera la capacità dell'approccio di raccolta naturale di soddisfare la domanda. Questo approccio evita il comportamento di blocco a velocità limitata dei generatori di numeri casuali basati su metodi più lenti e puramente ambientali.
Sebbene un generatore di numeri pseudorandom basato esclusivamente su una logica deterministica non possa mai essere considerato una "vera" fonte casuale nel senso più puro del termine, nella pratica sono generalmente sufficienti, anche per applicazioni critiche per la sicurezza. I generatori di numeri pseudorandom progettati e implementati con cura possono essere certificati per scopi crittografici critici per la sicurezza, come nel caso degli algoritmi Yarrow e Fortuna. Il primo è alla base della sorgente di entropia /dev/random su FreeBSD, AIX, macOS, NetBSD e altri. OpenBSD utilizza un algoritmo di numeri pseudorandom noto come arc4random.
Metodi di generazione
Metodi fisici
I primi metodi di generazione di numeri casuali, come i lanci di dadi, di monete e le ruote della roulette, sono utilizzati ancora oggi, soprattutto nei giochi e nelle scommesse, poiché sono troppo lenti per la maggior parte delle applicazioni in statistica e crittografia.
Un generatore di numeri casuali fisico può essere basato su un fenomeno fisico atomico o subatomico essenzialmente casuale, la cui imprevedibilità può essere attribuita alle leggi della meccanica quantistica. Le fonti di entropia includono il decadimento radioattivo, il rumore termico, il rumore degli spari, il rumore a valanga nei diodi Zener, le deviazioni dell'orologio, i movimenti temporali della testina di lettura di un disco rigido e il rumore radio. Tuttavia, i fenomeni fisici e gli strumenti utilizzati per misurarli presentano generalmente asimmetrie e distorsioni sistematiche che rendono i loro risultati non uniformemente casuali. Un estrattore casuale, come una funzione hash crittografica, può essere utilizzato per ottenere una distribuzione uniforme di bit da una sorgente non uniformemente casuale, ma a una velocità di bit inferiore.
Nel 2013 è stato sviluppato un prototipo di generatore di numeri casuali in tempo reale ad alta velocità basato su un laser caotico.
Sono stati sviluppati vari metodi ingegnosi per raccogliere queste informazioni entropiche. Una tecnica consiste nell'applicare una funzione hash a un fotogramma di un flusso video proveniente da una fonte imprevedibile. Lavarand ha utilizzato questa tecnica con immagini provenienti da più lampade di lava. HotBits ha misurato il decadimento radioattivo con tubi Geiger-Müller, mentre Random.org ha registrato le fluttuazioni dell'ampiezza del rumore atmosferico con una normale radio.
Metodi assistiti dal computer
La maggior parte dei numeri casuali generati dai computer utilizza i PRNG, algoritmi in grado di generare automaticamente lunghe sequenze di numeri con buone proprietà di casualità, ma alla fine le sequenze si ripetono (o l'utilizzo della memoria cresce indefinitamente). Questi numeri casuali sono sufficienti in molte situazioni, ma non sono casuali come i numeri generati dal rumore elettromagnetico atmosferico usato come fonte di entropia. L'insieme dei valori generati da questi algoritmi è generalmente determinato da un numero fisso chiamato seme. Uno dei PRNG più comuni è il generatore di congruenze lineari, che utilizza la relazione di ricorrenza
Xn+1=(aXn+b)mod mX_{n+1} = (aX_n + b) \mod mXn+1=(aXn+b)modm
viene utilizzata per generare numeri in cui aaa, bbb e mmm sono numeri interi grandi e Xn+1X_{n+1}Xn+1 è il numero successivo di una serie di numeri pseudorandom. Il numero massimo di numeri che la formula può generare è il modulo mmm. La relazione di ricorrenza può essere estesa alle matrici per avere periodi molto più lunghi e migliori proprietà statistiche. Per evitare alcune proprietà non casuali di un singolo generatore di congruenza lineare, è possibile utilizzare in parallelo diversi generatori di numeri casuali con valori leggermente diversi del coefficiente moltiplicatore aaa, con un generatore di numeri casuali "master" che seleziona tra i diversi generatori.
Un metodo semplice per generare manualmente numeri casuali è il cosiddetto metodo dei quadrati medi, proposto da John von Neumann. Sebbene sia facile da implementare, il suo risultato è di scarsa qualità. Ha un periodo molto breve e gravi punti deboli, come il fatto che la sequenza in uscita converge quasi sempre a zero. Una recente innovazione consiste nel combinare il metodo dei quadrati medi con una sequenza di Weyl. Questo metodo produce risultati di alta qualità per un lungo periodo.
La maggior parte dei linguaggi di programmazione contiene funzioni o routine di libreria che forniscono generatori di numeri casuali. Spesso sono progettati per fornire un byte o una parola casuali o un numero in virgola mobile uniformemente distribuito tra 0 e 1.
La qualità, cioè la casualità, di tali funzioni di libreria varia notevolmente, da un risultato completamente prevedibile a uno crittograficamente sicuro. Il generatore di numeri casuali standard di molti linguaggi, tra cui Python, Ruby, R, IDL e PHP, si basa sull'algoritmo di Mersenne Twister e non è sufficiente per scopi crittografici, come esplicitamente indicato nella documentazione del linguaggio. Tali funzioni di libreria hanno spesso scarse proprietà statistiche e alcuni schemi si ripetono dopo solo decine di migliaia di tentativi. Spesso sono inizializzate con l'orologio in tempo reale di un computer come seme, poiché tale orologio è a 64 bit e misura in nanosecondi, ben oltre la precisione di una persona. Queste funzioni possono fornire una casualità sufficiente per alcuni compiti (ad esempio i videogiochi), ma sono inadatte quando è richiesta una casualità di alta qualità, come nelle applicazioni crittografiche o statistiche.
Generatori di numeri casuali di qualità superiore sono disponibili sulla maggior parte dei sistemi operativi; ad esempio, /dev/random su vari derivati di BSD, Linux, Mac OS X, IRIX e Solaris, o CryptGenRandom per Microsoft Windows. La maggior parte dei linguaggi di programmazione, compresi quelli menzionati in precedenza, forniscono un modo per accedere a queste fonti di livello superiore.
Generato dalle persone
La generazione di numeri casuali può essere eseguita anche dall'uomo, raccogliendo vari input dagli utenti finali e utilizzandoli come fonte di casualità. Tuttavia, la maggior parte degli studi ha riscontrato che i soggetti umani presentano un certo grado di non casualità quando cercano di generare una sequenza casuale, ad esempio di cifre o lettere. Potrebbero passare da una scelta all'altra troppo spesso rispetto a un buon randomizzatore; di conseguenza, questo approccio non è molto utilizzato. Per lo stesso motivo per cui gli esseri umani si comportano male in questo compito, la generazione umana di numeri casuali può essere utilizzata come strumento per ottenere approfondimenti sulle funzioni cerebrali non accessibili con altri mezzi.
Postelaborazione e controlli statistici
Anche con una fonte di numeri casuali plausibile (magari da un generatore hardware basato sulla meccanica quantistica), è necessario prestare attenzione per ottenere numeri completamente imparziali. Il comportamento di questi generatori cambia spesso con la temperatura, la tensione di alimentazione, l'età del dispositivo o altre influenze esterne.
I numeri casuali generati sono talvolta sottoposti a test statistici prima di essere utilizzati, per garantire che la fonte sottostante funzioni ancora, e vengono poi post-elaborati per migliorare le loro proprietà statistiche. Un esempio è il generatore di numeri casuali hardware TRNG9803, che utilizza una misurazione dell'entropia come test hardware e poi postelabora la sequenza casuale con un cifratore di flusso a registro a scorrimento. In genere è difficile utilizzare test statistici per convalidare i numeri casuali generati. Wang e Nicol hanno proposto una tecnica di verifica statistica basata sulla distanza, utilizzata per identificare i punti deboli di più generatori di numeri casuali. Li e Wang hanno proposto un metodo per testare i numeri casuali basato su sorgenti di entropia caotica laser che utilizzano le proprietà del moto browniano.
I test statistici sono utilizzati anche per garantire che l'output finale post-elaborato di un generatore di numeri casuali sia veramente imparziale; sono stati sviluppati numerosi pacchetti di test di casualità.
Ulteriori considerazioni
Personalizzare la distribuzione
Distribuzioni uniformi
La maggior parte dei generatori di numeri casuali lavora nativamente con numeri interi o singoli bit, quindi è necessario un passaggio aggiuntivo per ottenere la "canonica" distribuzione uniforme tra 0 e 1. L'implementazione non è così banale come dividere un intero per il suo valore massimo possibile. L'implementazione non è così banale come dividere il numero intero per il suo valore massimo possibile. In particolare:
- Il numero intero utilizzato nella trasformazione deve fornire un numero di bit sufficiente per la precisione desiderata.
- La natura stessa dell'aritmetica in virgola mobile implica una maggiore precisione quanto più il numero è vicino allo zero. Questa precisione extra non viene normalmente utilizzata a causa dell'elevato numero di bit necessari.
- Gli errori di arrotondamento durante la divisione possono falsare il risultato. Nel peggiore dei casi, un'area presumibilmente esclusa può essere disegnata con numeri reali, contrariamente alle aspettative della matematica.
L'algoritmo principale utilizzato da OpenJDK, Rust e NumPy è descritto in una proposta per l'STL di C++. Non utilizza la precisione extra e soffre di distorsione solo nell'ultimo bit a causa dell'arrotondamento al numero pari più vicino. Altri problemi numerici sono validi se questa distribuzione uniforme "canonica" viene spostata in un intervallo diverso. Un metodo proposto per il linguaggio di programmazione Swift sostiene di utilizzare ovunque la massima precisione.
I numeri interi distribuiti uniformemente sono spesso utilizzati in algoritmi come il Fisher-Yates shuffle. Anche in questo caso, un'implementazione ingenua può introdurre una distorsione del modulo nel risultato, quindi è necessario utilizzare algoritmi più elaborati. Un metodo che non esegue quasi mai la divisione è stato descritto da Daniel Lemire nel 2018, mentre l'attuale stato dell'arte è l'"algoritmo ottimale" ispirato alla codifica aritmetica di Stephen Canon di Apple Inc. nel 2021.
La maggior parte dei RNG da 0 a 1 include lo 0 ma esclude l'1, mentre altri includono o escludono entrambi.
Altre distribuzioni
Data una fonte di numeri casuali uniformemente distribuiti, esistono alcuni metodi per creare una nuova fonte casuale che corrisponda a una funzione di densità di probabilità. Un metodo chiamato metodo dell'inversione prevede l'integrazione in un intervallo maggiore o uguale al numero casuale (che dovrebbe essere generato tra 0 e 1 per distribuzioni corrette). Un secondo metodo, detto di accettazione-rifiuto, prevede la scelta di un valore di x e di y e la verifica se la funzione di x è maggiore del valore di y. In caso affermativo, la funzione di x è maggiore del valore di y. In caso affermativo, il valore x viene accettato. Altrimenti, il valore x-w