edutecnica

Esercizio 5       

Sviluppare un'algoritmo che permetta di riempire un vettore di 5 elementi interi con 5 numeri compresi fra 0 e 9 (inclusi) in modo casuale (random) e senza che vi siano ripetizioni.

(questo algoritmo è molto importante i fini della simulazione di fenomeni come il gioco del lotto o l'estrazione di una carta da un mazzo: ossia estrazioni che non prevedono la possibilità della reimmissione dell'elemento scelto da un dato insieme).


Il problema può essere assimilato all'esperienza di avere una scatola con all'interno 10 palline numerate dallo 0 al 9 e di effettuare 5 estrazioni casuali. Se il problema prevedesse la possibilità di reimmissioni nel vettore sarebbero ammesse anche ripetizioni; la costruzione di un algoritmo del genere non pone problemi:Si crea un generatore di numeri random da 0 a 9 e si effettuano 5 estrazioni:

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

const int n=5; main(){
int i,T[n];
//caricamento
srand(time(0));
for(i=0;i < n;i++)T[i]=rand()%10;
//stampa a video
for(i=0;i < n;i++)cout << " " << T[i];
}//fine main

per evitare che ci siano ripetizioni di numeri già presenti nel vettore dobbiamo modificare il primo ciclo for (quello del caricamento). La prima estrazione (i=0) non pone problemi, ma per quelle successive occorre controllare tutte le posizioni del vettore precedenti a quella attuale per verificare se qualcuno dei numeri estratti in precedenza sia uguale a quello attuale; in tal caso bisogna ripetere l'estrazione; secondo lo schema illustrato sotto.

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
const int n=5;
main(){
int i,j,T[n];
int d;
//caricamento
srand(time(0));
for(i=0;i < n;i++)
if(!i)T[i]=rand()%10;
else do{
     d=0;
     T[i]=rand()%10;
     for(j=0;j < i;j++)
          if(T[i]==T[j])d=1;
}while(d);
//stampa a video
for(i=0;i < n;i++)cout << T[i];
}//fine main

Nel nostro caso usiamo la variabile intera d (avremmo anche potuto usare una variabile booleana). Il ramo else dell'if(!i) riguarda tutti i casi in cui il valore corrente dell'indice i è diverso dalla prima posizione. Viene usato un ciclo do-while all'inizio del quale d viene posta a 0, viene estratto il numero casuale e con un secondo indice j tramite un'altro ciclo for vengono scansionate le posizioni nel vettore precedenti alla i-esima, se viene trovata un'uguaglianza fra il valore estratto e uno dei valori estratti in precedenza (T[i]==T[j]) il ciclo do viene ripetuto altrimenti d viene posta ad 1 e questa è la condizione di rilascio dal ciclo do che implicitamente conferma che il numero estratto attualmente non è già presente nel vettore. Data l'articolazione del ciclo for di caricamento, ne riportiamo lo schema a blocchi.