Sapreste dirmi che differenza c'è tra rand() %100 e rand()*100/RAND_MAX,
sul mio libro sul linguaggio c della rand non ne parla come se fosse un argomento a parte voi mi sapreste aiutare?![]()
Sapreste dirmi che differenza c'è tra rand() %100 e rand()*100/RAND_MAX,
sul mio libro sul linguaggio c della rand non ne parla come se fosse un argomento a parte voi mi sapreste aiutare?![]()
rand() %100 -> da un numero da 0 a 99 {il % è il modulo cioè il resto della divisione}
rand()*100/RAND_MAX -> dipende da cos'è RAND_MAX
Ci sarebbero molte considerazioni da fare sulla funzione rand(), se vuoi approfondire il discorso leggi Misconceptions about rand.
"Se riesci a passare un pomeriggio assolutamente inutile in modo assolutamente inutile, hai imparato a vivere."
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.
io ho avuto una "strana" esperienza con rand(), che non mi spiego e vorrei comprendere.
Ho del codice c che richiede l'uso di numeri casuali, basato sull'uso della funzione rand, che viene richiamato da java tramite JNI.
Se eseguo il codice da solo, ovvero non richiamandolo da Java, RAND_MAX vale (ho verificato sia nella libreria sia stampando su consolle il valore) 0x7FFFFFFF (2147483647) e i numeri generati da rand() effettivamente variano da 0 a 2147483647.
Se eseguo il codice richiamandolo da Java tramite JNI RAND_MAX continua a valere 2147483647 (ne ho fatto stampare il valore con la printf) ma rand() genera valori da 0 a 32767.
Sapreste darmi una spiegazione?
Non risollevare discussioni vecchie e ferme da tempo, soprattutto per parlare di un problema che stai già affrontando in un'altra discussione.Originariamente inviato da Epris
io ho avuto una "strana" esperienza con rand(), che non mi spiego e vorrei comprendere.
Ho del codice c che richiede l'uso di numeri casuali, basato sull'uso della funzione rand, che viene richiamato da java tramite JNI.[...]
MARCO BREVEGLIERI
Software and Web Developer, Teacher and Consultant
Home | Blog | Delphi Podcast | Twitch | Altro...