La funzione rand()
sarà espressamente tenuto a produrre la stessa sequenza di numeri quando seminato con un determinato seme (chiamando srand()
) ; ogni possibile valore di seme specifica una sequenza. E se non chiami mai srand()
, ottieni la stessa sequenza che avresti ottenuto chiamando lo srand(1)
prima di qualsiasi chiamata allo rand()
.
(Questo non si applica trasversalmente diverse implementazioni C++ C o.)
Questo può essere utile per scopi di test. Se c'è un bug nel tuo programma, per esempio, puoi riprodurlo eseguendolo nuovamente con lo stesso seme, garantendo che (escludendo altri comportamenti imprevedibili) otterrai la stessa sequenza di numeri pseudo-casuali.
Chiamare il numero srand(time(NULL))
è il solito metodo consigliato per ottenere numeri pseudo-casuali più o meno imprevedibili. Ma non è perfetto. Se il tuo programma viene eseguito due volte entro lo stesso secondo, probabilmente otterrai la stessa sequenza, perché time()
(in genere) ha una risoluzione di 1 secondo. E le implementazioni tipiche di `rand() sono non abbastanza buone per l'uso crittografico; è troppo facile per un utente malintenzionato indovinare quali numeri si otterranno.
Esistono numerose altre implementazioni di numeri casuali. I sistemi Linux hanno due pseudo-dispositivi, /dev/random
e /dev/urandom
, da cui è possibile leggere valori di byte pseudo-casuali di qualità ragionevole.Alcuni sistemi potrebbero avere funzioni come random()
, drand48()
e così via. E ci sono numerosi algoritmi; Ho sentito cose positive sullo Mersenne Twister.
Per qualcosa come un gioco, in cui non ti aspetti né ti interessi i giocatori che cercano di imbrogliare, srand(time(NULL))
e rand()
è probabilmente abbastanza buono. Per scopi più seri, dovresti ricevere consigli da qualcuno che ne sa più di me.
La sezione 13 dello comp.lang.c FAQ ha alcune informazioni molto buone sulla generazione di numeri pseudo-casuali.
fonte
2011-10-13 01:13:13
Vedere http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro