Concetti Chiave
- I numeri pseudocasuali in C++ sono utilizzati per simulare la casualità, poiché i computer operano in modo deterministico.
- La funzione "rand()" genera numeri pseudocasuali basandosi su un seme iniziale impostato con "srand()".
- Per ottenere numeri sempre diversi, si può utilizzare il seme generato dall'orologio di sistema tramite "time()".
- Il range dei numeri può essere limitato usando l'operatore modulo (%) e un offset, per personalizzare la sequenza.
- L'algoritmo LCG (Linear Congruential Generator) è uno dei più noti per generare numeri pseudocasuali, con parametri specifici per efficacia.
I numeri pseudocasuali in c++
Il computer funziona in modo deterministico, perciò in esso non esiste davvero la casualità. Per risolvere alcuni problemi, però, è necessario generare numeri casuali, paragonabili al lanciare una monetina o un dado o all’estrarre un numero della tombola. L’unica soluzione è quindi quella di utilizzare i numeri pseudocasuali. Essi possono essere ottenuti in vari modi. Usando la funzione “rand ()” è possibile generarli a partire da un seme, inserito mediante la funzione “srand ()”; in questo modo però se si usa lo stesso seme iniziale i numeri generati saranno sempre i medesimi. Per ottenerne sempre di diversi si può partire con un seme casuale, che viene generato dall’orologio di sistema mediante la funzione “time ()” con argomento “NULL”, per la quale è necessario però includere la libreria “time.h”. A volte però è necessario restringere il range, per questo è necessario usare l’operatore modulo (%) seguito dalla quantità di numeri nell’intervallo; è inoltre possibile impostare un offset sommando il numero dal quale si vuole partire al numero pseudocasuale generato. Per generare le sequenze sono stati ideati molti algoritmi, ma solo alcuni sono davvero efficaci ed efficienti. Per verificare il buon funzionamento di un algoritmo è necessario che sia riproducibile, portabile, abbia un lungo periodo e sia computazionalmente veloce; inoltre i numeri generati devono essere uniformemente distribuiti e non correlati tra loro. Il criterio di Turing e quello di von Neumann consentono di valutare l’efficacia o meno di un algoritmo. Uno degli algoritmi più noti fu proposto da Lemer è detto LCG (Linear Congruential Generator) ed ha come formula xn = ( axn-1 + c ) % m , con a, c ed m costanti e in relazione tra loro ed xn e xn-1 che indicano l’n-esimo numero ed il seme di partenza. Alcuni studiosi hanno individuato dei valori di a,c ed m che rendono l’LCG molto efficace; in particolare la terna migliore e più usata è quella di Goodman e Miller ( m = 231 – 1; a = 75; c = 0 ).Domande da interrogazione
- Come si generano numeri pseudocasuali in C++?
- Quali sono le caratteristiche di un buon algoritmo per la generazione di numeri pseudocasuali?
- Qual è uno degli algoritmi più noti per la generazione di numeri pseudocasuali e quali sono i suoi parametri ottimali?
In C++, i numeri pseudocasuali si generano usando la funzione "rand()" a partire da un seme impostato con "srand()". Per ottenere numeri diversi ad ogni esecuzione, si può usare un seme casuale generato dall'orologio di sistema con "time(NULL)".
Un buon algoritmo deve essere riproducibile, portabile, avere un lungo periodo, essere computazionalmente veloce, e generare numeri uniformemente distribuiti e non correlati tra loro.
Uno degli algoritmi più noti è l'LCG (Linear Congruential Generator), con la formula xn = ( axn-1 + c ) % m. I parametri ottimali individuati da Goodman e Miller sono m = 231 – 1, a = 75, e c = 0.