PDA

View Full Version : [C]random per generazione di numeri anche negativi


santaclause83
09-10-2007, 15:02
devo fare una funzione che genera double random tra 1 e -1

srand(time(NULL));

double nuovo = (double) rand()/(double)RAND_MAX; può funzionare??


...per prendere anche i negativi e mantenermi più casuale possibile come potrei fare??

avevo pensato a moltiplicare il random per RAND_MAX e dividere per 2,se è divisibile lo moltiplico per -1 altrimenti lo lascio così com'è...

non è che ci sono metodi più efficaci per un calcolo del genere??

cionci
09-10-2007, 15:15
((double)rand()/(double)(RAND_MAX))*2 - 1

Così ottieni un double fra -1 e 1 compresi ;)

Ziosilvio
09-10-2007, 15:26
http://www.hwupgrade.it/forum/showthread.php?t=1196677

Lo so che dovrei aggiornarla, ma qualcosina ancora la dice...

Ziosilvio
09-10-2007, 15:27
((double)rand()/(double)(RAND_MAX))*2 - 1
(double)rand()/(double)(RAND_MAX+1) ecc.

santaclause83
09-10-2007, 15:30
grazie mille! ma non capisco come fa..nel senso:

-Il random estrae un double grande massimo quanto RAND_MAX
-il RAND_MAX viene moltiplicato per 2,quindi darà un double grande qualcosa tipo 64mila e qualcosa
-il -1 cos'è??non è moltiplicato vero??..

sembra che sopra io abbia massimo rand max e sotto rand max per il doppio sottratto di uno...

grazie ancora!

andbin
09-10-2007, 15:30
Vedi anche un mio esempio in <questa> (http://www.hwupgrade.it/forum/showthread.php?t=1330044) discussione.

cionci
09-10-2007, 15:52
(double)rand()/(double)(RAND_MAX+1) ecc.
Il tuo discorso è giusto per ottenere la distribuzione di probabilità esatta, ma non permette di ottenere il +1 come rosultato finale ;)

santaclause83: ti tolgo il (double) per farti capire meglio

(rand()/RAND_MAX) * 2 - 1

rand()/RAND_MAX permette di ottenere un numero fra 0 e 1 compresi.
Lo moltiplichi per 2 ed hai quindi un numero fra 0 e 2, ci togli 1 ed ottieni un numero fra -1 e +1 compresi.

Ziosilvio
10-10-2007, 15:49
-Il random estrae un double grande massimo quanto RAND_MAX
rand restituisce un intero compreso tra 0 e RAND_MAX inclusi.
-il RAND_MAX viene moltiplicato per 2,quindi darà un double grande qualcosa tipo 64mila e qualcosa
Non è solo RAND_MAX a essere moltiplicato per 2, ma tutta la quantità (double)rand()/(double)(RAND_MAX).
-il -1 cos'è??non è moltiplicato vero?
Naturalmente no: la moltiplicazione dà un risultato compreso tra 0.0 e 2.0 inclusi (come fa giustamente osservare cionci), quindi sottraendo 1 ottieni una quantità compresa tra -1.0 e 1.0 inclusi.