Esercizio No. 5 Vettori

Esercizio No. 5 Vettori

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).
Soluzione:

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 è ià presente nel vettore. 
Data l’articolazione del ciclo for di caricamento, ne riportiamo lo schema a blocchi.

Commento all'articolo