Lo scopo di questa esercitazione e' di prendere dimestichezza con la generazione dei numeri (PSEUDO) casuali.

Scrivere il codice sorgente

La libreria di utilità generiche stdlib.h fornisce, tra le altre, la funzione rand() per la generazione di numeri casuali, con valori compresi tra 0 e la costante RAND_MAX, anch'essa definita in stdlib.h, con valore che può variare a seconda del sistema.

La funzione rand() può essere utile per simulazioni di giochi, oppure per generare insiemi di dati campioni per il test di applicazioni che elaborano dati in input.

L'esercitazione si svolge in più fasi.


i. Conosci il tuo sistema? Scopriamo il valore di RAND_MAX
   - Invocare l'editor per il nostro programma:

     > emacs stampaRAND_MAX.c &

   - Digitare il seguente testo all'interno della finestra dell'editor:

/* Programma per la stampa della
costante RAND_MAX */

#include <stdio.h>
#include <stdlib.h>
 
int main () {
   printf("Il valore di RAND_MAX e' %d\n",RAND_MAX);

return EXIT_SUCCESS;
   }


    - Compilare il sorgente:

     > gcc -ostampa stampaRAND_MAX.c

    - Eseguire il programma per vedere il valore della costante:

     > ./stampa


ii. Simuliamo il lancio di un dado
   - Invocare l'editor per il nostro programma:

     > emacs dado.c &

   - Digitare il seguente testo all'interno della finestra dell'editor:

/* Programma per simulare il lancio
di un dado */

#include <stdio.h>
#include <stdlib.h>
 
int main () {
   int esito = rand() % 6; //genera un numero casuale fra 0 e 5
esito++; //otteniamo un valore fra 1 e 6

//stampa del risultato
printf("Il lancio del dato ha prodotto la faccia %d\n",esito);

return EXIT_SUCCESS;
   }


    Notare l'utilizzo dell'operatore % di resto modulo divisione di interi per ricondurre il valore casuale generato dalla funzione rand() ad un intervallo piu' ristretto.

    - Compilare il sorgente:

     > gcc -olancioDado dado.c

    - Eseguire il programma per simulare il lancio del dado:

     > ./lancioDado


iii. Randomizzare

   - Provate ad eseguire il programma per il lancio del dado piu' volte. Otterrete sempre lo stesso risultato!!!
    Il problema non e' dovuto ad un baco del sistema, ma semplicemente al fatto che
rand() genera numeri pseudo-casuali, cioe' numeri deterministici che "sembrano" casuali.
      Ad esempio, se proviamo a simulare il lancio di due dadi all'interno dello stesso programma, otterremo risultati diversi.

   -  Per fare in modo (se lo vogliamo) che ogni esecuzione del programma generi un diverso valore del lancio del dado, dobbiamo variare il seme usato per inizializzare il generatore di numeri pseudo-casuali (operazione che in gergo viene chiamata randomizzazione).

    - La randomizzazione viene fatta tramite la funzione
srand(), che richiede un parametro di input di tipo unsigned (intero senza segno).
   
    - Per generare il seme, tipicamente viene sfruttata la funzione
time() della libreria time.h che, invocata con parametro NULL (una costante speciale che useremo anche nel prosieguo del corso) restituisce un valore unsigned che rappresenta l'ora corrente del giorno espressa in secondi.

    - Modifichiamo il codice sorgente:


/* Programma per simulare il lancio
di un dado - versione randomizzata */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main () {
   int esito;
srand(time(NULL)); //inizializza il generatore
  esito = rand() % 6; //genera un numero casuale fra 0 e 5
esito++; //otteniamo un valore fra 1 e 6

//stampa del risultato
printf("Il lancio del dato ha prodotto la faccia %d\n",esito);

return EXIT_SUCCESS;
   }

    - Compilare il sorgente:

     > gcc -olancioDado dado.c

    - Eseguire il programma per simulare il lancio del dado randomizzato:

     > ./lancioDado


iv. Simuliamo un numero prefissato di lanci

   - Scriviamo un progamma per generare un numero prefissato N di lanci consecutivi del dado.
   

    - Modifichiamo il codice sorgente:


/* Programma per simulare il lancio
di N dadi - versione randomizzata */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100 //definizione della costante N con valore 100
 
int main () {
   //dichiarazioni
int esito,i;

srand(time(NULL)); //inizializza il generatore

for (i = 1; i <= N; i++) { //ripete il lancio N volte
  esito = 1+ rand() % 6; //genera un numero casuale fra 1 e 6

//stampa del risultato
printf("%d\n",esito);
}

return EXIT_SUCCESS;
   }

    - Compilare il sorgente:

     > gcc -olancioDado dado.c

    - Eseguire il programma per simulare il lancio randomizzato di
N dadi, e salvare la lista dei risultati nel file risultati.txt:

     > ./lancioDado > risultati.txt

      - Invocare il comando more per visualizzare il contenuto del file risultati.txt:

     > more risultati.txt




Esercitazioni non guidate

Risolvere il seguente esercizio e spedire il solo file sorgente (suffisso .c) all'indirizzo paolo.santi@iit.cnr.it all'interno di un messaggio di posta elettronica con subject: Esercitazione lezione 4. Nel messaggio indicare il vostro nome, cognome e gruppo di appartenenza.

  1. Scrivere un programma che faccia le cose seguenti:
          a. simula una successione di lanci di moneta (Testa o Croce);
        b. continua a generare lanci di moneta fino a che la condizione di terminazione e' verificata;
c. la condizione di terminazione e' la seguente: la sequenza generata contiene almeno 5 esiti uguali consecutivi (es: 5 volte Testa, o 5 volte Croce)
d. il programma deve restitutire il numero di lanci di moneta che sono stati necessari per verificare la condizione di terminazione.


Torna alla HomePage del corso