Premetto che quel +1.0 è il motivo per cui nel mio primo messaggio mettevo le mani avanti dicendo che dovevo verificare che quello suggerito (ovvero lo stesso tuo metodo, ma senza quel +1.0) fosse corretto.
Insomma... ero indeciso se mettere o non mettere quel +1.0
Il motivo della perplessità è il seguente.
RAND_MAX è il massimo numero estratto dalla funzione rand().
Aggiungergli 1 può causare un warning ovvio:
Codice: Seleziona tutto
casual.c:16:34: warning: integer overflow in expression [-Woverflow]
Quello che non consideravo, leggendo le varie risorse a riguardo, è che c'è il cast a double e quindi il problema dell'overflow è risolto

Pertanto, da questo punto di vista, non rappresenta un problema.
Detto questo, quella divisione non è per via di una toppa di rand

Si fa quella divisione per normalizzare il numero estratto, dividendolo per il "numero" di numeri estraibili.
Se tu estrai un numero a caso tra 0 e RAND_MAX hai un totale di RAND_MAX + 1 numeri da poter estrarre.
La cosa simpatica è che sia con il +1 sia senza viene lo stesso risultato
Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(){
int i;
double num;
srand(time(NULL));
for(i=0; i<10; i++){
num = rand();
printf("%.6f\n", num/(float)RAND_MAX);
printf("%.6f\n", num/((float)RAND_MAX + 1));
}
return 0;
}
Codice: Seleziona tutto
vaevictis@vaevictis-HAL:~/Scrivania$ g++ -o casual casual.c
vaevictis@vaevictis-HAL:~/Scrivania$ ./casual
0.103147
0.103147
0.507267
0.507267
0.855904
0.855904
0.928802
0.928802
0.760466
0.760466
0.582616
0.582616
0.916554
0.916554
0.422087
0.422087
0.699902
0.699902
0.297756
0.297756
Tutti questi ragionamenti sono ovviamente da inquadrare in uno scenario in cui rand() non sia da evitare come i vetri nelle mutande.