back to top

Numeri random in C++: le funzioni rand() e srand()

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;
}

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!

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Radice quadrata in C: vediamo come calcolarla in diversi modi

La radice quadrata è un'operazione matematica piuttosto comune (in...

Sperimentare la sequenza di Collatz in C++

Vediamo come verificare la congettura di Collatz con C++....

Calcolare la radice quadrata con Python

In Python è possibile calcolare la radice quadrata usando...

12 film che ogni programmatore dovrebbe guardare (per trovare ispirazione e creatività)

Molti ragazzi hanno deciso di intraprendere una carriera da...

Cartonizzare una foto con Python e la libreria OpenCV

La cartoonization è una procedura grafica che consente di...

Creare flowchart (diagrammi di flusso) online: 5 strumenti gratuiti

Hai bisogno di realizzare una flow chart ma non...
Pubblicitร