Come generare numeri casuali senza ripetizioni in C

In questa lezione verrà mostrato come creare un programma in grado di generare dei numeri casuali senza ripetizioni in C. L’idea di fondo è quella di utilizzare un array per memorizzare i numeri che sono già stati generati, in questo modo, ogni volta che un nuovo numero viene generato controlliamo se questo è già stato creato in precedenza.

Procedimento

Di base abbiamo bisogno dei concetti visti nelle lezioni precedenti, quali la creazione di un array con numeri casuali e come generare dei numeri casuali in C.

Per quanto riguarda la generazione di numeri casuali, dobbiamo utilizzare la funzione rand, ma per evitare che ad ogni esecuzione del programma venga generato sempre lo stesso numero, abbiamo bisogno anche della funzione srand e della funzione time. L’utilizzo di queste tre funzione ci permettono di generare numeri pseudo-casuali ad ogni esecuzione del programma.

Nota: per poter utilizzare tali funzioni, è necessario includere nel proprio header del file le librerie stdlib.h e time.h.

Per quanto riguarda la parte di controllo delle ripetizioni tramite l’array, il concetto di base è il seguente: dichiariamo un array di dimensione pari al numero di valori che verranno generati casualmente, ed ogni volta che un nuovo numero viene generato, inseriamo il valore 1 nella posizione dell’array identificata dal numero generato. In questo modo ad ogni generazione basta controllare se l’array in posizione uguale al valore generato è 1 (quindi esiste già) oppure è diverso (quindi non era ancora stato generato). 

Per capire meglio il funzionamento del programma, consideriamo il seguente esempio: vogliamo generare 100 numeri casuali senza ripetizioni, di conseguenza dichiariamo un array di 100 elementi tutti inizializzati a 0. Ogni volta che un numero casuale viene generato, per esempio 6, controlliamo nella posizione 6 dell’array se il numero contenuto è 0, se si allora inseriamo il valore 1 al posto di 0, in quanto il numero 6 doveva ancora uscire. In questo modo, se il numero successivo dovesse essere nuovamente 6, controllando la posizione 6 dell’array si troverebbe il numero 1, indicando che 6 era già stato estratto.

Consideriamo di voler generare 100 numeri casuali senza ripetizioni. Per far ciò abbiamo bisogno di un array di dimensione 100 e di una variabile per contenere l’ultimo numero casuale generato. Successivamente dobbiamo inizializzare ogni elemento contenuto nell’array con il numero 0. 

A questo punto possiamo iniziare con la generazione dei valori casuali, utilizzando un ciclo for per generare 100 numeri ed un ciclo do while posizionato al suo interno, per verificare che l’ultimo numero casuale non sia già stato generato precedentemente. In particolare se il numero è già stato creato in precedenza, il ciclo do while continua a generare un numero casuale fino a che non viene generato un nuovo numero.

Per quanto riguarda la generazione dei numeri casuali, generiamo semplicemente dei numeri compresi tra 0 e 100, chiaramente devono corrispondere al range di elementi che si possono inserire all’interno dell’array.

Programma completo per generare numeri casuali senza ripetizioni in C

Di seguito viene riportato il codice completo del programma in grado di generare numeri casuali senza ripetizioni in C. In particolare ad ogni iterazione del ciclo for stampiamo a schermo il numero casuale generato, in questo modo al termine del ciclo avremo l’ordine di come sono stati generati i 100 valori.

#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100 int main(){     srand(time(NULL));     int a[N], num;     // Inizializziamo l'array con 0     for(int i = 0; i < N; i++){         a[i] = 0;     }     // Generazione numeri casuali senza ripetizioni     for(int i = 0; i <= N; i++){         do {            num = rand() % 101;          } while(a[num] == 1);                  a[num] = 1;         printf("%d ", num);     }     return 0; }