|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2003
Città: Milano
Messaggi: 58
|
C e rand()
gente, mi sono accorto che la funzione rand() restituisce sempre lo stesso valore... nel senso che, è vero, se faccio x esempio un ciclo for e faccio scrivere 100 volte il valore di rand() questo è sempre diverso, ma alla successiva esecuzione del programma i numeri sono gli stesis nello stesso ordine... come faccio a evitare la cosa e ad ottenere numeri diversi ad ogni esecuzione del programma?
graz ciao
__________________
kiriku - Lastcode Software www.lastcode.org/kiriku |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
inizializza il seme con un bell srand(time(NULL)) cosi rand ha il seme dell tempo di sisema che è sempre diverso.
Poi per prendere un num fai rand()%N dove N è il numero massimo che vuoi ottenere Ciao
__________________
Gnu/Linux User
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Apr 2003
Città: Milano
Messaggi: 58
|
grazie funziona!
ciao
__________________
kiriku - Lastcode Software www.lastcode.org/kiriku |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Una piccola nota rand()%N permette di ottenere interi fra 0 e N-1
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
|
Quote:
Hai fatto bene a puntualizzare
__________________
Gnu/Linux User
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2003
Messaggi: 980
|
grazie mille, serve anche a me
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
ragazzi scusate ma non è possibile che se il ciclo for è eseguito molto velocemente il srand(time(NULL)) restituisca sempre lo stesso valore, perchè il time(NULL) restituisce sempre lo stesso valore, o questo pericolo non sussiste?
Ultima modifica di VegetaSSJ5 : 07-06-2004 alle 13:49. |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il pericolo sussiste...infatti srand(time(NULL)) va fatto una sola volta all'interno di tutto il programma !!!
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...la srand DEVE essere chiamata una sola volta nel programma in modo da sfruttare lo stesso seme per la generazioni di tutti i numeri random di un programma...altrimenti non sono più molto casuali (vabbè che non lo erano nemmeno prima, ma se lo chiami più volte lo sono meno
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
cionci dimmi se questo può andar bene
Codice:
.
.
int i=0;
srand(time(NULL)+i);
for (i=0; i<50; ++i) printf("%d", rand());
.
.
|
|
|
|
|
|
#12 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Il seme del generatore di numeri casuali e' sempre lo stesso; srand lo inizializza con un valore specifico (eventualmente calcolato sul momento), mentre rand lo usa per calcolare il nuovo valore e lo aggiorna con questo.
Per cui, in una sequenza srand --- rand --- srand --- rand, la seconda rand parte dal valore impostato dalla seconda srand, non da quello impostato dalla prima rand. [EDIT] Invece, in srand --- rand --- rand, la seconda rand parte dal valore impostato dalla prima rand. [/EDIT] Io chiamerei srand una volta sola, all'inizio del programma. La teoria dice che la sequenza dei valori di rand a partire da un seme scelto "casualmente" e' "casuale"; ma non penso che questo valga anche per una serie di semi scelti piu' o meno "sequenzialmente". Eventualmente, darei la possibilita' di chiamarla con un valore a scelta dell'utente anziche' con l'output di time, in modo da poter sia ottenere un comportamento impredicibile, sia replicare esattamente un esperimento.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 07-06-2004 alle 17:47. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Concordo con Ziosilvio
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
se ho capito bene secondo quanto detto da ziosilvio la rand() oltre che a generare un valore partendo da un seme, aggiorna quel seme al valore appena calcolato, pertanto quando si fa una rand() è superfluo fare una srand() per aggiornare il seme quindi la srand() va fatta solo all'inizio del programma giusto?
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì...
|
|
|
|
|
|
#16 | |
|
Junior Member
Iscritto dal: Sep 2004
Città: Cittadina del Mondo
Messaggi: 10
|
Quote:
Come posso fare per ottenere invece un random decimale, un float compreso tra 0 e 1? |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Dipende....hai un numero di decimali prefissato che vuoi ottenere ?
Se non vuoi un numero di decimali prefissato basta dividere per RAND_MAX (è una costante che solitamente identifica il numero massimo positivo rappresentato sugli interi)... (double)rand() / RAND_MAX Il risultato è ovviamente un double... |
|
|
|
|
|
#18 |
|
Bannato
Iscritto dal: Jul 2004
Città: Tatooine
Messaggi: 506
|
per usare sempre rand puoi fare cosi' per esempio:
float x; x=(float)(rand()%101)/100.0; cosi' ottieni un numero decimale compreso tra 0 e 1 con precisione di 2 zeri dopo la virgola |
|
|
|
|
|
#19 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Codice:
(double)rand() / (RAND_MAX+1) Il metodo "esatto" dovrebbe essere questo: Codice:
(double)rand() / (RAND_MAX+1U) A questo punto, una variabile aleatoria bernoulliana X di parametro p (che vale 1 con probabilita' p, 0 con probabilita' 1-p) si genera semplicemente ponendo: Codice:
X = ((double)rand() / (RAND_MAX+1U)) < p;
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 13-09-2004 alle 16:25. |
|
|
|
|
|
|
#20 | |
|
Junior Member
Iscritto dal: Sep 2004
Città: Cittadina del Mondo
Messaggi: 10
|
Quote:
Grazie, è quello che cercavo di ottenere, anche se temo di non essermi espressa chiaramente! |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:18.



















