Per usare rand() bisogna inizializzare (basta una volta) il “generatore di numeri random”.

//inizializzazione generatore di numeri random
srand(time(NULL));

Quando si invoca la funzione rand() questa restituisce un valore casuale (o random) compreso in un certo intervallo. Se questo intervallo non è definito, si usa un intervallo di default che va da 0 a 32766, per cui rand() restituisce in modo casuale numeri interi che vanno da 0 a 32766. Essendo incluso anche lo 0, il totale dei numeri gestiti da rand() è 32767 (che è diverso da 32766!!!).

Questo numero totale è chiamato RAND_MAX interpretabile come la “dimensione” del range.

Ora sapendo che RAND_MAX è il totale dei numeri gestibili con la funzione rand(), possiamo dire che il più piccolo di questo totale di numeri è 0 mentre il più grande è RAND_MAX-1

n.ro più piccolo      RAND_MAX-1
  ↑                       ↑
+---+---+---+---+-----+-------+
| 0 | 1 | 2 | 3 | ... | 32766 |
+---+---+---+---+-----+-------+
⌊______________________________⌋
               ↓
       RAND_MAX == 32767

Per capire meglio. Se non fosse stato considerato lo 0 e si partiva da 1, la dimensione totale (RAND_MAX) coincideva con il numero più grande del range (che non si sarebbe chiamato RAND_MAX-1 ma RAND_MAX) .

Definire un intervallo per rand()

Se RAND_MAX-1 è il valore random più grande restituito da rand(), il valore più piccolo è 0.

Quindi se non specificato diversamente, la funzione rand() restituisce un valore casuale da 0 a RAND_MAX-1.

//rand() restituisce in n valori casuali da 0 a 32766
n = rand();

Il codice sopra può essere scritto anche come il seguente.

//RAND_MAX di default vale 32767
//rand() restituisce valori da 0 a RAND_MAX-1
//rand() restituisce in n valori casuali da 0 a 32766
n = rand() % 32767 ;
//rand() e rand() % 32767 sono identiche. 

È possibile definire un totale RAND_MAX diverso da quello di default usando il segno %.

//RAND_MAX == 100;
//rand() restituisce valori da 0 a RAND_MAX-1
//rand() restituisce in n valori casuali da 0 a 99
n = rand() % 100;
//  ⌊___________⌋
//        ├───────────── se (rand() % 100) restituisce 0  , n == 0
//        └───────────── se (rand() % 100) restituisce 100, n == RAND_MAX-1 == 99

Genericamente è possibile definire intervalli diversi in questo modo:

n = ( rand() % max ) + min;
//  ⌊______________⌋
//         ├───────────── se (rand() % max) restituisce 0    , n == +min
//         └───────────── se (rand() % max) restituisce max-1, n == (max-1)+min
//Ricorda che rand() fornisce valori da 0 a RAND_MAX-1

Vediamo un esempio con i numeri.

//Valori tra 5 e 100
n = ( rand() % 96 ) + 5;
//  ⌊_____________⌋
//         ├───────────── se (rand() % 95) restituisce 0 , n == +5
//         └───────────── se (rand() % 95) restituisce 95, n == 95+5 == 100
//Ricorda che rand() fornisce valori da 0 a RAND_MAX-1

//Valori tra -100 e 100
n = ( rand() % 201 ) - 100;
//  ⌊______________⌋
//         ├───────────── se (rand() % 201) restituisce 0  , n == -100
//         └───────────── se (rand() % 201) restituisce 200, n == 200-100 == 100
//Ricorda: rand() fornisce valori da 0 a RAND_MAX-1

Definire un intervallo usando scanf()

Se il range si riceve in input con (es.) scanf(), bisogna calcolare RAND_MAX. Per calcolarlo e sufficiente sottrarre dal max il min e aggiungere 1.

//in generale
n = [ rand() % (max - min + 1) ] + min;
//             ⌊_____________⌋
//                    ↓
//                 RAND_MAX

Questo medoto vale sempre. Vediamo qualche esempio.

//valori inseriti in input tramite scanf() 
//min == 5 e max == 100.
//tecnicamente RAND_MAX deve essere 96 ovvero 100-5+1 quindi max-min+1.

//Valori tra 5 e 100.
n = [ rand() % (100 - 5 + 1) ] + 5;
//  ⌊________________________⌋
//              ├───────────── se (rand() % (95 + 1)) restituisce 0 , a == +5
//              └───────────── se (rand() % (95 + 1)) restituisce 95, a == 95 + 5 == 101
//Ricorda che rand() restituisce valori da 0 a RAND_MAX-1
//valori inseriti in input tramite scanf() 
//min == -100 e max == 100.
//tecnicamente RAND_MAX deve essere 201 ovvero 100-(-100)+1 quindi max-min+1.

//Valori tra -100 e 100.
n = [ rand() % (100 - (-100) + 1) ] + (-100);
//  ⌊_____________________________⌋
//              ├───────────── se (rand() % (100 - (-100) +1)) restituisce 0  , a == -100
//              └───────────── se (rand() % (100 - (-100) +1)) restituisce 200, a == 200 - 100 == 100
//RAND_MAX == (100 - (-100) +1) == 201
//Ricorda: rand() restituisce valori da 0 a RAND_MAX-1