TOC

This article is currently in the process of being translated into Italian (~99% done).

Misc:

Randomness with the Random class

A un certo punto, è probabile che abbiate bisogno di ottenere la casualità nella vostra applicazione. I motivi possono essere molteplici: forse dovete ordinare gli elementi di un elenco in modo casuale (mischiare) o forse state creando un gioco e volete che l'avversario si muova in una direzione casuale. Qualunque sia la ragione, è necessario un modo per ottenere un valore casuale dal computer e, fortunatamente, C# può aiutarci in questo senso.

Nella maggior parte dei casi, si inizia con la classe Random, che consente di generare uno o più numeri casuali all'interno di un intervallo specifico. È anche abbastanza semplice da usare:

Random random = new Random();
Console.WriteLine("A random number: " + random.Next());

Inizializziamo una nuova istanza della classe Random e poi chiamiamo il metodo Next() per ottenere un numero casuale (intero) - una cosa molto semplice!

Se avete bisogno di un numero decimale invece che di un intero, potete usare il metodo NextDouble() che vi darà un numero compreso tra 0.0 (incluso) e 0.99 (qualsiasi cosa inferiore a 1.0, in realtà):

Random random = new Random();
Console.WriteLine("A random number with decimals: " + random.NextDouble());

Un random tra due valori

Nella maggior parte dei casi, non si vuole un numero casuale qualsiasi, ma un numero che rientri in un intervallo, ad esempio tra 1 e 100. Non c'è problema, la classe Random può farlo in modo molto semplice:

Random random = new Random();
Console.WriteLine("A random number between 1 and 100: " + random.Next(1, 101));

Basta cambiare la chiamata Next() con una che includa un numero minimo e uno massimo. Si noti che mentre il valore minimo è inclusivo (questo numero è incluso nel possibile risultato), il valore massimo è esclusivo (questo numero NON è incluso nel possibile risultato), motivo per cui uso 101 invece di 100. Se si volesse un numero compreso tra 0 e 99, il codice sarebbe invece così:

Console.WriteLine("A random number between 0 and 99: " + random.Next(0, 100));

Seeding della classe Random

La classe Random viene sempre istanziata con un seme, sia direttamente se lo si fornisce, sia indirettamente dal framework. Questo seme permette di controllare la casualità: un seme specifico usato più volte permette di creare lo stesso insieme di numeri casuali. Può sembrare strano, ma può essere utile per testare scenari specifici nella vostra applicazione/gioco.

Un seme viene fornito alla classe Random utilizzando il sovraccarico del costruttore in questo modo:

Random random = new Random(1000);

Vediamo cosa succede se lo usiamo per generare 5 numeri casuali uno dopo l'altro:

Random random = new Random(1000);
for(int i = 0; i < 5; i++)
	Console.WriteLine("A random number between 1 and 100: " + random.Next(1, 101));

Indipendentemente dal numero di volte in cui si esegue questo codice, sono abbastanza sicuro che i 5 numeri "casuali" ottenuti avranno questo aspetto:

A random number between 1 and 100: 16
A random number between 1 and 100: 24
A random number between 1 and 100: 76
A random number between 1 and 100: 1
A random number between 1 and 100: 70

Come si può vedere, i valori casuali creati dalla classe Random non sono poi così casuali. Utilizzano invece il valore del seme per creare valori pseudo-casuali. Pertanto, quando l'utente non fornisce un seme, il framework ne crea uno per lui. Nel framework .NET originale, viene utilizzata l'ora corrente, mentre il framework .NET core più moderno utilizza il generatore di numeri pseudo-casuali statico per generare un seme. In altre parole, a meno che non abbiate bisogno di una casualità controllata, potete semplicemente utilizzare il costruttore predefinito della classe Random, come quello usato nei primi esempi.

Riepilogo

Utilizzate la classe Random per generare un numero casuale, ma a meno che non vogliate che sia prevedibilmente casuale, è necessario utilizzare un seme casuale: il framework se ne occuperà per voi, a meno che non forniate specificamente un seme attraverso l'overload del costruttore.

Tenete presente che l'istanziazione della classe Random è piuttosto costosa, quindi non fatela più volte all'interno di un ciclo; al contrario, istanziate una singola istanza di Random e richiamate il metodo Next() tutte le volte che ne avete bisogno.

Infine, come abbiamo già detto, la classe Random è un generatore pseudocasuale. Se si ha bisogno di qualcosa di più sicuro, ad esempio per la crittografia e/o la generazione di password casuali, si può usare la classe RNGCryptoServiceProvider.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!