Come creare una lista in C# di elementi random, ovvero casuali? In questo articolo scopriamo come farlo grazie agli strumenti di C#!
In questo articolo voglio essere molto diretto e con un linguaggio davvero semplice, visto che parliamo di un problema relativamente semplice.
Ciao mi chiamo Lorenzo Neri e sono un informatico: realizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!
Immaginiamo di voler creare una lista generica, con un contenuto uniforme, con una lunghezza definita.
Con gli strumenti che C# ci mette a disposizione, la faccenda è davvero semplice e facile.
Ma voglio proporti un ragionamento diverso, sfruttando anche un algoritmo molto rapido per creare una lista random.
L’algoritmo di cui ti voglio parlare è quello di Fisher-Yates: permette di eseguire quello che in gergo tecnico, chiamiamo shuffle.
Usiamo lo shuffle per la nostra lista random
Lo shuffle non è nient’altro che una mescolatura dei nostri elementi. In parole povere, partiamo da un insieme di elementi ordinati, per poi mescolarli per bene affinché siano ordinati casualmente.
Questo “ordinamento casuale” non è nient’altro che un modo diverso per dire random 😀
Quindi, per implementare la nostra soluzione tramite questo algoritmo, userò per semplicità una lista generica e una funzione:
private static Random casualizzatore = new Random();
public static void Shuffle<T>(this IList<T> list)
{
int n = list.Count;
while (n > 1) {
n--;
int k = casualizzatore.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
Semplice, rapido, immediato, quadrato, pratico, buono.
cit.
“Perchè usare una lista generica Lorenzo?” Ti starai giustamente chiedendo.
Beh, perchè in questo modo possiamo sì creare una lista random, ma di qualsiasi tipo poiché viene castata una lista generica. Così facendo, come vedremo poi, potremo usare QUALSIASI TIPO DI LISTA!
Ok, a questo punto abbiamo capito come creare una lista random in C#, ma ora sorge un altro problema.
Come usare il nostro generatore di liste random in C#
Per usare tutto il ben di dio che abbiamo scoperto, scritto, analizzato, ribaltato… Ho finito le parole, ci basta veramente poco in realtà:
// Come vedi qui, sto usando una lista di interi, ma il tipo poteva essere QUALUNQUE!
List<int> listaDaGenerare = new List<int>();
// Aggiungiamo qualche elemento
listaDaGenerare = listaDaGenerare.Add(1);
listaDaGenerare = listaDaGenerare.Add(2);
listaDaGenerare = listaDaGenerare.Add(3);
// Eseguiamo lo shuffle
listaDaGenerare.Shuffle();
Concludo facendo notare una cosa anche ai meno esperti di C#.
Ci hai fatto caso che ho chiamato la funzione “shuffle” da noi creata prima non come funzione a sé, ma come metodo?
Questa cosa è possibile perché, come dicevo prima, abbiamo creato la funzione affinché funzionasse con qualsiasi tipo di lista, viene appunto “castata” la lista generica.
Di conseguenza, è utilizzabile con qualsiasi lista, di conseguenza è accettata come metodo.