|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2003
Città: Rimini
Messaggi: 1842
|
[c++] funzione rand, srand e time
Mi sapete dare una mano su questa cosa?
Devo generare delle sequenze di numeri casuali, per ora ho scritto questo: int c=0; int n; for(n=0;n<15;n+1) { n++; srand(n); c=rand(); printf(" %d",c); } getch(); Stamattina discutendo col mio prof ho capito questo: srand(n) da un seme alla funzione e rand() genera il numero. Il problema è che se il numero n non cambia il numero generato è sempre uguale. Insomma bisogna cambiare il seme ogni volta che se ne genera uno, però se lo cambio secondo un algoritmo di operazioni fisse tipo facendo n+1 come nell'esempio, mi genera una sequenza di numeri e la volta dopo mi rigenera la stessa sequenza. Quindi il numero n (ovvero il seme) dovrebbe prendere un valore casuale, per esempio i decimi di secondo dell'orologio di sistema, e questo non so farlo. Mi sapete dire come funziona e qual'è la funzione per prendere i decimi di secondi o al limite se non si puo i secondi? Oppure un altro metodo per generare sequenze di numeri? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Dovresti includere l'header <time.h> e poi generare il numero tipo: Es.:
Codice:
srand(time(0)) ;
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#3 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Mi spiego: la funzione rand è fatta in modo da generare a partire da un valore fissato (detto seme) una sequenza che "non mostri proprietà di regolarità evidenti" (qualunque cosa ciò voglia dire). I generatori pseudorandom meno raffinati sono basati su congruenze lineari, del tipo x[n+1]=(a*x[n]+b)%N. Il tuo codice ogni volta inizializza il seme con un valore in sequenza, e poi chiama una volta rand su quel valore del seme: ma se rand usa una congruenza lineare, allora gli output di rand a partire dai termini di una progressione aritmetica formano anch'essi una progressione aritmetica. Un modo per aggirare il problema è inizializzare il seme una volta sola a partire dal tempo di sistema, restituito dalla funzione time sotto forma di secondi trascorsi dalla mezzanotte del primo gennaio 1970, e poi fare solo chiamate a rand, la quale è fatta in modo da aggiornare il seme ogni volta che viene chiamata.
__________________
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 |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:24.