Vediamo come generare numeri casuali in C++. Fulcro del nostro lavoro sarร la funzione rand() la quale viene utilizzata per generare un numero compreso nell’intervallo tra 0 e RAND_MAX, dove RAND_MAX รจ un valore che cambia a seconda del compilatore usato (in genere 32767).
Nell’esempio che segue vediamo come generare un numero compreso tra 0 e 999:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
// genero un numero casuale compreso tra 0 e 999
cout<<rand()%1000<<endl;
}
Indice
Generare un numero casuale compreso in un intervallo: l’operatore modulo (%)
L’istruzione rand()%1000
genera un numero intero compreso tra 0 e 999. Se utilizziamo l’istruzione rand()%N
, infatti, otterremo un numero compresi tra 0 ed N-1.
Per impostare un massimo si ricorre all’operatore modulo (%) che, come sappiamo, serve per calcolare il resto di una divisione intera e questo spiega perchรฉ il valore massimo puรฒ essere N-1! Facciamo un esempio: un qualsiasi numero diviso per 5 puรฒ dare come resto 0, 1, 2, 3 e 4… non puรฒ dare 5 perchรฉ altrimenti avremmo una divisione intera senza resto!
Qualche esempio:
rand()%2 // genera un numero compreso tra 0 e 1
rand()%100 // genera un numero compreso tra 0 e 99
rand()%43 // genera un numero compreso tra 0 e 42
rand()%10+5 // genera un numero compreso tra 5 e 14
Nell’ultima istruzione abbiamo aggiunto +5 (questo numero prende il nome di offset) a entrambi i numeri dell’intervallo (il minore ed il maggiore).
Il numero casuale รจ sempre lo stesso!
Proviamo a salvare, compilare il codice visto all’inizio di questo articolo e ad eseguire il programma. Noterete che tutte le volte che eseguite il codice otterrete sempre lo stesso numero! Ma com’รจ possibile? Non doveva essere un generatore di numeri casuali??
La spiegazione di questo fenomeno รจ legata alla funzione rand()
: questa, infatti, non genera un numero realmente casuale ma, semplicemente, restituisce il prossimo valore pseudo-casuale nella sequenza di valori che va da 0 a RAND_MAX. Per ottenere un numero casuale, quindi, รจ necessario cambiare il punto iniziale (seme) di quella sequenza usando srand()
.
Generare un numero casuale ustilizzando srand() e time()
Per farlo avremo bisogno di arricchire il codice visto in precedenza con le funzioni srand()
e time()
. vediamo un esempio che prevede l’utilizzo di un semplice ciclo for per creare non uno ma 10 numeri casuali:
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
// inizializzo il generatore di numeri pseudo-casuali
srand(time(NULL));
for(int i=0;i<10;i++) {
// genero un numero casuale compreso tra 0 e 9
cout<<rand()%10<<endl;
}
}
La funzione srand()
serve a inizializzare la funzione per la generazione dei numeri casuali: senza di essa allo stesso seed (seme) il programma estrarrebbe sempre gli stessi numeri casuali. Un trucco per rendere casuale il seme รจ quello di impostarlo con time(NULL) o time(0) incorporando la relativa funzione che si trova nella libreria ctime (che abbiamo incluso nel nostro progetto).
Si noti che nel primo esempio proposto in questo articolo la funzione srand()
non era presente: tutte le volte che rand()
viene usato senza che il programmatore abbia premesso srand()
รจ come se fosse stato impostato srand(1)
… ed รจ per questo che l’esempio precedente restituiva sempre lo stesso numero!