arii_98 di arii_98
Ominide 11 punti

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 ).
Hai bisogno di aiuto in Informatica?
Trova il tuo insegnante su Skuola.net | Ripetizioni
Registrati via email