Come generare numeri casuali in C#

di: Giorgio Borelli - del: 07 March 2010
Filed Under: C#, .NET framework

Comm generare un numero casuale in C#Nel .net framework non poteva di certo mancare una classe per gestire i numeri random (casuali), questa è la classe System.Random, la quale ci permette di generare numeri casuali interi, double o riempire array di byte. Possiamo specificare anche un valore massimo, o un range di valori nel quale il nostro numero casuale deve ricadere.

 

Tramite la classe Random generare numeri casuali in C# è davvero un gioco da ragazzi, dobbiamo porre però attenzione a questo argomento, poichè nasconde un'insidia, infatti è bene sapere che la classe Random permette di generare numeri pseudo-casuali, i numeri generati non sono completamente casuali, poiché sono generati da un'algoritmo matematico (algoritmo sottrattivo) che per sua natura stessa non può essere casuale.

 

La genereazione di un numero casuale avviene partendo da un valore d'inizializzazione, detto seme, scegliendo sempre lo stesso seme si otterrà sempre la stessa sequenza di numeri pseudo-casuali, proprio perchè generati da un'algoritmo matematico. Per ottenere dei numeri veramente casuali è necessario variare il valore del seme in base ad un qualche fattore, molto utile potrebbe essere il fattore tempo, affidandoci magari al clock di sistema.

 

Andiamo a vedere come usare la classe Random per generare numeri casuali in C#, facendo bene distinzione tra quelli pseudo-casuali e quelli casuali puri.

 

 

Generari numeri pseudo-casuali

Generare un numero pseudo-casuale in C# è davvero facilissimo, basta instanziare la classe Random e richiamare gli opportuni metodi, come illustrato nelle righe di codice sottostante:

 

            //creo l'ogetto random (costruttore senza parametri)

            Random random = new Random();

 

            //ritorna un numero casuale non negativo

            int nun = random.Next();

 

            //ritorna un numero casuale compreso tra zero e novanta

            int num2 = random.Next(90);

 

            //ritorna un numero casuale compreso tra 1 e 10

            int num3 = random.Next(1, 10);

 

l'oggetto random viene creato invocando il costruttore di default (senza parametri), in questo caso il .net framework come seme iniziale userà un valore ricavato dal clock di sistema, se l'intervallo temporale è troppo breve, la sequenza di numeri casuali generata sarà la stessa, provate ad esempio ad invocare il metodo Next di random dentro un breve ciclo for, vi accorgerete che la sequenza di numeri generata è identica, proprio perchè il clock di sistema è limitato, e nel "breve" arco di tempo in cui si ripete il ciclo for restituirà sempre lo stesso valore del seme iniziale. Ecco perchè i numeri generati in questo modo vengono detti pseudo-casuali e non casuali, poichè dipendono da un'algoritmo matematico e da un valore seme d'inizializzazione. Il loro uso è comunque accettabile nella stragrande maggioranza dei casi in cui si voglia generare un numero (o più di uno), da un insieme finito di elementi che abbia la stessa probabilità di uscita di tutti gli altri.

 

 

Generari numeri pseudo-casuali

Allora come fare per generare numeri casuali puri? La classe Random oltre al costruttore di default senza parametri, ne possiede un'altro che accetta come parametro un intero con segno che non è altro che il valore del seme, possiamo quindi andare ad agire sul seme d'inizializzazione instanziando l'ogetto random con un valore fornito nel modo più casuale possibile, e per far ciò abbiamo due strade, la prima è quella di generare il seme in modo casuale a sua volta, la seconda è quella di generare il seme basandoci su un fattore temporale che sia il più breve possibile, e cosa c'è di meglio se non sfruttare i millisecondi del clock di sistema, faremo in questo modo:

 

Random random = new Random((int)DateTime.Now.Millisecond);

 

basandoci su un'arco temporale così ristretto possiamo stare ragionevolmente certi che la generazione del seme sia diverso di volta in volta, generando pertanto numeri casuali abbastanza puri.

NOTA: Ovviamente stiamo considerando un caso potenzialmente reale, dove il seme viene ricreato al verificarsi magari di un click esterno, se invece come prima lo inseriamo dentro un ciclo for anche i millisencondi risultano troppo lunghi per generare un seme che porti a numeri casuali affidabili.

 

Oltre al classico metodo Next, la classe Random prevede altri due metodi per generare sequenze di numeri casuali in virgola o per riempire (fill) array di byte, richiamarli è semplicissimo, basta scrivere:

 

            //ritorna un double compreso tra 0.0 ed 1.0

            double num4 = random.NextDouble();

 

            //riempie un array di byte di 100 elementi con dei numeri casuali

            byte[] arrayNum = new byte[100];

            random.NextBytes(arrayNum);

 

 

 

 Il primo genera un numero casuale in virgola compreso tra zero ed uno, il secondo, dopo aver dichiarato l'array di bytes, riempie i suoi elementi con dei numeri casuali compresi tra 0 e 256.

 

Conclusioni

Sulla classe Random per generare numeri casuali col .net framework non c'è molto altro d'aggiungere, desidero lasciarvi con una piccolissima applicanzioncina windows per la generazione di un numero casuale scritta in tutta fretta in C#, che potete divertirvi a modificare per provare i concetti descritti in questo articolo.

 

 

Provate e sperimentate, e se vi và fatemi sapere i vostri pareri tramite i commenti, invece se dovreste prendere un bel terno con i numeri generati dall'esempio fatemi un fischio, come minimo merito una cena.

 

Per seguire gli articoli di www.informaticando.net iscrivetevi al suo feed RSS.

Comments (2) E-mail del.icio.us share su Facebookfacebook Permalink Post RSS   Bookmark and Share

Comments

7/30/2010 2:45:40 AM #

SimplyHosting Review

Cheers for this blog post, It's great to see another BlogEngine user. Most users these days seem to use other systems like Wordpress, but I think BlogEngine.NET is the best system to use.

SimplyHosting Review United States | Reply

7/30/2010 3:57:22 AM #

red ring of death

Car My business is with regard to element excellent xbox 360 though As well as somewhat baffled by may pro/elite/core clothes workplace has arranged will be able to i beg you be the reason for of the fact that a number genuinely helpfull.

red ring of death United States | Reply

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading





Tag cloud

Ultimi Commenti

Comment RSS

Most comments

meniscus surgery meniscus surgery
17 comments
us United States
meniscus surgery meniscus surgery
16 comments
us United States
meniscus surgery meniscus surgery
13 comments
us United States
SimplyHosting Review SimplyHosting Review
6 comments
us United States
user.anonimo user.anonimo
1 comments
it Italy
lingerie lingerie
1 comments
us United States
Kecia Fonceca Kecia Fonceca
1 comments
us United States
zemne prace ponuka zemne prace ponuka
1 comments
us United States
Gregory Despain Gregory Despain
1 comments
us United States
health insurance quotes health insurance quotes
1 comments
us United States