Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] rand e srand

  1. #1

    [C] rand e srand

    Ciao a tutti, ho un problema a capire delle cose, sto sudiando come generare i numeri random.

    Perche dentro srand si puo scrivere un numero e dentro rand no?
    per esempio
    codice:
    srand(50);
    rand () % 4;
    Non ho capito bene queste cosi, perche si usa il simbolo%?
    nel mio esempio genera un numero a caso tra 0 e 4.

    però srand invece cosa fa? ne genera un otra 0 e 50?


    Non riesco a capirla questa parte...

  2. #2
    Dato che il PC solitamente non ha un metodo per generare tutti i numeri casuali che potrebbero essere richiesti, si impiega un cosiddetto generatore di numeri casuali, che non è altro che un algoritmo che genera una successione di numeri apparentemente casuali ma che di fatto basa ogni numero estratto su quello che ha estratto prima. Per questo, per evitare di avere sempre la stessa successione di numeri casuali, si deve inizializzare il generatore di numeri casuali (tramite la funzione srand) con un valore che cambia ad ogni avvio del programma; a questo scopo, solitamente si usa la funzione time(NULL), che restituisce un timestamp (di fatto un valore che aumenta di 1 ogni secondo), che quindi dovrebbe essere differente ad ogni avvio del programma.
    codice:
    #include <time.h>
    #include <stdlib.h>
    
    /* ... */
    /* Inizializza il generatore di numeri casuali */
    srand(time(NULL));
    È sufficiente effettuare questa operazione una volta all'inizio del programma. Per ottenere numeri casuali, a questo punto, è sufficiente richiamare la funzione rand().
    La funzione rand() restituisce un numero casuale compreso tra 0 e un numero molto grande. Pertanto, se vuoi restringerla ad un certo range, solitamente si usa l'operatore modulo (%), che restituisce il resto della divisione tra il primo operando e il secondo. Ovviamente il modulo non può restituire un numero più grande del secondo operando, ed è per questo scopo che lo si usa.
    codice:
    /* ottiene un intero casuale nel range [0, 9] */
    int i=rand()%10;
    In realtà il metodo del modulo non è ottimale per tutta una serie di ragioni che ho riassunto una volta in questo mio post, magari dacci un'occhiata (è in inglese, ma se ben ricordo con l'inglese tu non hai problemi ).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Se ho capito bene,il computer in se non è capace di creare numeri random, quindi si puo dire che se stampo due volte questo:
    codice:
    srand (58);
    rand () & 3;
    mi darà sempre lo stesso risultato?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Si (ma cambia la & con %).

    Questo perchè la sequenza del generatore viene inizializzata sempre dallo stesso valore, e quindi otterrai sempre la stessa sequenza di numeri pseudocasuali.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  5. #5
    Quindi tecnicamente si puo prevedere in anticipo cosa succede in un gioco di carte ad una certa ora? =)
    ad un certo secondo piu che altro

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    In effetti si, se sai l'ora esatta a cui viene eseguita la srand puoi prevedere tutta la sequenza di numeri.
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  7. #7
    una cosa, se non si utilizza srand, di default è come se ci fosse srand (1)?

  8. #8
    Sì; lo standard C (§7.20.2.2.2) dice:
    If rand is called before any calls to srand have been made, the same sequence shall be generated as when srand is first called with a seed value of 1.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Grazie ragazzi, tutto chiaro, come al solito siete disponibili e aiutate gli utenti in difficolta =)

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 © 2024 vBulletin Solutions, Inc. All rights reserved.