Ti daranno sempre lo stesso range di numeri pseudocasuali da 0 a 99.Originariamente inviato da silver81
rand() %100 e rand()*100/RAND_MAX
Innanzitutto:
RAND_MAX è una costante che vale 32767 (se provi a stamparla lo puoi verificare) e corrisponde al massimo intero che può generare la funzione rand(). Mi pare sia definita in stdlib ma controlla perché non ne sono sicuro.
Per quanto riguarda la tua domanda, quella che sto per darti è più una spiegazione di statistica che altro, e comunque io non ho MAI studiato statistica, quindi mi esprimo in maniera elementare e per esempi, parole tecniche non ne conosco.
Sia rand() %100 che rand()*100/RAND_MAX ti daranno uno stesso range di numeri pseudocasuali, per la precisione tra 0 e 99; questo perché
rand()%100: la rand genera un numero qualsiasi tra 0 e 32767 ma di questo numero viene considerato il resto della divisione intera per 100, quindi qualsiasi numero generi (3000, 32000) con l'operatore modulo si riconduce ad uno del range 0-99 (per esempio 31670%100 = 70, nonostante 31670 sia ben più grande di 99).
rand()*100/RAND_MAX: anche stavolta il range è lo stesso: 0-99 (stavolta può uscire fuori anche 100 ma solo se rand()=32767, che essendo un caso su appunto 32767 è trascurabile). Qualsiasi numero generi la rand viene moltiplicato prima per 100 e poi diviso per 32767; se fai delle prove ti renderai conto facilmente che più di 99 (e cento in un solo caso) non puoi ottenere.
A questo punto qual è la differenza tra le due operazioni? E' un fatto di distribuzione dei numeri:
Se provi la prima (rand()%100) ti renderai conto che la distribuzione di numeri che ti danno 0, 1, 2, 3 ecc... è omogenea, questo perché ci sono delle classi di congruenza. Mi spiego:
per ottenere 0 con questa operazione, la rand dovrebbe generare questi numeri: 0, 100, 200, 300, 400, 500, 600 ecc... fino ad un massimo di 32700. Il resto della divisione intera per 0 di questi numeri, infatti, è appunto 0.
per ottenere 1 invece la classe di congruenza è 1, 101, 201, 301, 401... ecc...
Come vedi, quindi, gli elementi della classe di congruenza sono equamente distribuiti in tutto il range dei numeri possibili da 0 a 32767.
Cosa del tutto diversa è per rand()*100/RAND_MAX
Per ottenere 0, infatti, i numeri prodotti dalla rand devono andare da 0 a 327 (per tutti questi numeri, infatti, il resto dell'operazione sarebbe sempre 0, tenendo presente il concetto di divisione intera)
Per ottenere 1, invece, i numeri prodotti dalla rand devono essere compresi tra 328 e 328+327, ossia 655; ancora una volta per tutti questi numeri il risultato del calcolo sarebbe 1, non di meno e non di più.
E così via... 2 -> 656 - 983; 3 -> 984 - 1310 ecc...
Noterai quindi che stavolta la distribuzione dei numeri per ottenere 0, 1, 2 ecc... non è più omogenea in tutto il range 0-32767 ma va a intervalli regolari di 327 numeri.
E' solo una differenza statistica, tutto qui.