Visualizzazione dei risultati da 1 a 9 su 9

Discussione: C] numeri casuali

  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    C] numeri casuali

    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?

  2. #2
    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 );
    }
    codice:
    [michele@linux c]$ gcc -o r rand.c
    [michele@linux c]$ ./r
     1804289383 
      846930886 
    [michele@linux c]$ ./r
     1804289383 
      846930886
    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.

    Infatti se provi a mettere:

    codice:
    srand ( 13U );
    srand ( 16U );
    /* ecc.. */
    vedi come ad ogni numero, cambia sempre la generazione dei numeri casuali.
    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.

    codice:
    srand ( ( unsigned int ) time ( NULL ) );
    Che quindi casta il valore restituito dalla time (); in un unsigned int e ti permette di avere sempre numeri diversi tra loro.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    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

  4. #4
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    mooooolto chiaro.
    grazie!:adhone:

  5. #5
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    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:

  6. #6
    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....

  7. #7
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    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!

  8. #8
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    ci guardo con calma...

  9. #9
    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...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.