dopo una ricerchina sul forum riguaredante la generazione di numeri casauli (pseudo?), ho imparato che esistono due funzioni int rand() e srand(int seme);
vorrei saperne di più!
dove trovo un po' di documentazione su questo ergomento?
dopo una ricerchina sul forum riguaredante la generazione di numeri casauli (pseudo?), ho imparato che esistono due funzioni int rand() e srand(int seme);
vorrei saperne di più!
dove trovo un po' di documentazione su questo ergomento?
In pratica la funzione rand (); consente di estrarre un numero pseudo casuale compreso tra 0 e RAND_MAX.
Ti faccio un esempio:
codice:#include <stdio.h> int main ( void ) { int i , n; for ( i = 0 ; i < 2 ; i++ ) { n = rand ( ); printf( " %d \n " , n ); } return ( 0 ); }Come vedi però la sequenza di numeri ottenuta è sempre la stessa, quindi occorre utilizzare la funzione srand ( unsigned int ); per dare luogo a numeri casuali sempre diversi.codice:[michele@linux c]$ gcc -o r rand.c [michele@linux c]$ ./r 1804289383 846930886 [michele@linux c]$ ./r 1804289383 846930886
Infatti se provi a mettere:
vedi come ad ogni numero, cambia sempre la generazione dei numeri casuali.codice:srand ( 13U ); srand ( 16U ); /* ecc.. */
Ad ogni numero corrisponde quindi una frequenza di numeri casuali sempre uguale per lo stesso numero.
Quindi per favere un valore imprevedibile devi utilizzare il clock di macchina:
quindi la funzione time (); che restituisce l'ora.
Che quindi casta il valore restituito dalla time (); in un unsigned int e ti permette di avere sempre numeri diversi tra loro.codice:srand ( ( unsigned int ) time ( NULL ) );
michele
michele.facchin@virgilio.it
Server:irc.azzurra.org | /join #c
ricordati di includere <time.h> :bubu:
Debian GNU/Linux sid
Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
Kernel 2.6.14-ck1
ehmmm, una cosa...
se scrivo un programma per la generazione di numeri casuali, seguendo i vostri consigli, e poi uso uno script per farlo girare più volte, la sequenza di numeri sarà la stessa, suppongo perchè time restituirà un int e nel frattempo che quell'int cambi, lo script avrà già finito il suo lavoro.
le soluzioni che mi vengono in mente:
1)nello script impongo che il generatore parta ad ogni secondo, non so come si faccia, ma non credo sia impossibile; contro: il tempo di esecuzione nel caso di molte iterazioni!
2) passo il seme come paramentro alla procedura; la domenda è: c'è qualche tecnica particolare o la sequenza di inizializzazione del seme è del tutto indifferente?
avete qualche altro suggerimento?
ciao ciao:adhone:
Una considerazione che non c'entra nulla con il topic: mediamente le funzioni rand fornite con le implementazioni normali delle librerie C/C++ non sono il massimo della qualità. Un algoritmo di generazione casuale è "buono" quando sia impossibile prevedere quale numero verrà generato, spesso questi algoritmi usano qualche entità fisica per incrementare la casualità, come lo stato dell'hardware (non solo il clock o il time che sono troppo prevedibili).
Un buon algoritmo è indispensabile per applicazioni di crittografia o giochi, in cui si richiedono numeri che siano il più possibile casuali e soprattutto impredicibili.
http://www.irisa.fr/caps/projects/hipsor/HAVEGE1.0.html
Invece la risposta al thread.... non usare srand(time(NULL)) in un loop, altrimenti ottieni n volte lo stesso numero prima che il time si incrementi di 1....., usa srand una volta solo, poi usa rand tante volte....
sì, questo lo so.
Spiego meglio.
devo generare coppie di numeri con delle precise caratteristiche, dipendenti dalla sequenza di estrazioni; il programma le genera e me le manda in stdin; questo già in loop.(srand ne è fuori)
Lo script, a seconda dell'istanza del problema, si incarica di redirezionare l'out in un file il cui nome dipende dal contesto, nome che lo script "calcola" a seconda degli argomenti che gli passo; non volendo legare troppo il programma della generazione alla struttura del mio file system, avevo scelto questa via.
Quindi le domande rimangono irrisolte
:adhone:
ad ogni modo ora vado a guardare che c'è nel link!
ciao
e comunque studiare troppo mi rin........sce!
Quello che c'è nel link, lo proponevo solo come approfondimento di tipo "culturale", io vivo benissimo col rand classico del C senza complicarmi la vita, ma per chi vuole solo il meglio...