Torniamo sull'esercitazione non guidata della lezione scorsa, che chiedeva la simulazione di una mano del gioco della Tombola.

Una delle difficolta' dell'esercitazione consisteva nella generazione di numeri casuali in modo da simulare l'estrazione senza reimbussolamento. Ad esempio, per generare la cartella di gioco, bisognava estrarre 15 numeri compresi fra 1 e 90, avendo cura di evitare doppioni.

Esistono fondamentalmente due tecniche per simulare l'estrazione senza reimbussolamento: una prima tecnica occupa poca memoria, ma puo' allungare notevolemente il tempo di esecuzione del programma; mentre una seconda tecnica occupa piu' memoria, ma e' molto piu' veloce in termini di tempo di esecuzione del programma.

Vediamo un esempio di applicazione delle due tecniche per la generazione della cartella nel gioco della Tombola.

Prima tecnica (meno memoria occupata, pero' meno velocita')

/* Generazione della cartella della Tombola
Tecnica efficiente per la memoria, ma non per il
tempo di esecuzione
*/

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

#define TRUE 1
#define FALSE 0

int main () {
 
  int i,j,estratto,trovato;
  int cartella[15] = {0};
 
  srand(time(NULL));

  for (i=0; i<15 ; i++){
    do{
     estratto = rand()%90 +1;
     trovato = FALSE;
     for(j=0;j<=i;j++)
      if (cartella[i]==estratto){
        trovato = TRUE;
        break;
       }
      } while trovato;
    cartella[i]=estratto;
    }

  for(i=0;i<15;i++){
   printf("%4d", cartella[i]);
   if((i+1)%5==0) printf("\n");
  }

  return EXIT_SUCCESS;
}



Seconda tecnica (piu' memoria occupata, ma piu' velocita')

/* Generazione della cartella della Tombola
Tecnica efficiente per il tempo di esecuzione,
ma che occupa piu' memoria
*/

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

int main () {
 
  int i,j,estratto;
  int cartella[15] = {0};
  int cartellone[90] = {0};
 
  srand(time(NULL));

  for (i=0; i<15 ; i++){
    do{
     estratto = rand()%90;
      } while cartellone[estratto];
    cartella[i]=estratto+1;
    cartellone[estratto]=1;
    }

  for(i=0;i<15;i++){
   printf("%4d", cartella[i]);
   if((i+1)%5==0) printf("\n");
  }

  return EXIT_SUCCESS;
}


Torna alla HomePage del corso