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.