Dubbio double rand()

di il
5 risposte

Dubbio double rand()

Salve a tutti, avrei un dubbio relativo al corretto funzionamento della funzione
 rand() 
In caso dovessi stampare numeri compresi tra 0 e 1 (estremi non inclusi) non riesco a capire come impostare la funzione rand()

ho provato così:


#include <iostream>
#include <cstdlib>


using namespace std;

int main ()
{
    double r=0;
	
	for (int i=0; i<20; i++)
	{	 r=rand()/(RAND_MAX+1);
		 
		cout  << r << endl;
		
	}
	
	
	return 0;
	
	
}


Ma mi stampa 0, eppure a rigor di calcoli dovrebbe spuntare con la virgola, nonostante abbia dichiarato r come double.

5 Risposte

  • Re: Dubbio double rand()

    Manca il cast
    r = (double)rand()/(RAND_MAX+1);
  • Re: Dubbio double rand()

    Se dividi valori interi, hai un risultato intero a prescindere dalla destinazione.

    Oltre alla soluzione già indicata, potresti scrivere

    r = rand()/(RAND_MAX+1.0);
  • Re: Dubbio double rand()

    Ciao, il tuo codice purtroppo presenta parecchi problemi:
    - innanzitutto non inizializzi il seme a partire dal quale viene generata la sequenza di numeri casuali, quindi ad ogni lancio del programma i valori restituiti dalla funzione rand() saranno sempre gli stessi. Il seme viene inizializzato tramite la funzione srand() a cui va passato quindi un valore sempre diverso e per farlo si utilizza la funzione time(0), che a sua volta restituisce il numero di secondi trascorsi a partire dal 01/01/1970;
    - il motivo per cui ti stampa sempre 0 è che, nonostante r sia un double, stai valutando la divisione intera. La soluzione ovviamente è quella proposta da @Weierstrass, in quanto affinché non venga calcolato la parte intera del quoziente, almeno uno dei due operandi deve essere un valore in virgola mobile;
    - inoltre il tuo codice genera valori compresi nell'intervallo [0;1) e non (0;1) come invece desideri fare.
  • Re: Dubbio double rand()

    Nippolo ha scritto:


    Ciao, il tuo codice purtroppo presenta parecchi problemi:
    - innanzitutto non inizializzi il seme a partire dal quale viene generata la sequenza di numeri casuali, quindi ad ogni lancio del programma i valori restituiti dalla funzione rand() saranno sempre gli stessi. Il seme viene inizializzato tramite la funzione srand() a cui va passato quindi un valore sempre diverso e per farlo si utilizza la funzione time(0), che a sua volta restituisce il numero di secondi trascorsi a partire dal 01/01/1970;
    - il motivo per cui ti stampa sempre 0 è che, nonostante r sia un double, stai valutando la divisione intera. La soluzione ovviamente è quella proposta da @Weierstrass, in quanto affinché non venga calcolato la parte intera del quoziente, almeno uno dei due operandi deve essere un valore in virgola mobile;
    - inoltre il tuo codice genera valori compresi nell'intervallo [0;1) e non (0;1) come invece desideri fare.
    grazie mille , una spiegazione completa, ora ho capito: bisognava fare il cast, mi sono perso in un bicchiere d'acqua.
    Ero a conoscenza delle funzione time() e delle relativa libreria, idem per il seme non vi sono state inserite nel codice perché scritto alla meno peggio, giusto per evidenziare la relativa lacuna
    Per quanto riguarda la parte dell'esclusione degli estremi occorre (se non erro) inserire +1 prima di
    rand() 
    per escludere lo 0
  • Re: Dubbio double rand()

    68yslexic77ind ha scritto:


    Per quanto riguarda la parte dell'esclusione degli estremi occorre (se non erro) inserire +1 prima di
    rand() 
    per escludere lo 0
    Se intendi
    r=(rand()+1)/(RAND_MAX+1)
    l'intervallo considerato sarà (0;1].
    Per escludere lo 0 bisogna evitare che il numeratore assuma il valore 0, mentre per escludere l'1 bisogna evitare che il numeratore sia uguale al denominatore.
    Quindi la soluzione consiste o nel controllare che il valore restituito da rand() sia diverso da 0 e RAND_MAX e in tal caso la formula sarà semplicemente
    r=rand()/RAND_MAX
    oppure utilizzare direttamente una formula del genere:
    r=(rand()+1)/(RAND_MAX+2)
Devi accedere o registrarti per scrivere nel forum
5 risposte