Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [c# Numeri random]
Forum - C# / VB.NET - [c# Numeri random]

Avatar
sps84 (Normal User)
Pro


Messaggi: 199
Iscritto: 11/02/2009

Segnala al moderatore
Postato alle 23:10
Domenica, 14/02/2010
Ciao a tutti sto cercando di realizzare un semplice programmino che mi estrae dei numeri a caso uno diverso dall'altro, in giro ho trovato un pò di sorgenti ma non riesco a farli andare, quello qui di seguito è stato riadattato ma non funge, i numeri vengono estratti ma non vengono tolti dalla lista da cui vengono pescati per capirci

Codice sorgente - presumibilmente C++

  1. static void Main(string[] args)
  2.         {
  3.             SortedList sorted = new SortedList();
  4.             for (int x = 0; x < 20; x++)
  5.             {
  6.                 sorted.Add(x, x);
  7.             }
  8.             sorted.Remove(1);
  9.             for (int x = 1; x < 11; x++ )
  10.             {
  11.                 Console.WriteLine(sorted.GetByIndex(x));
  12.             }
  13.             Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
  14.             for (int x = 1; x < 11; x++)
  15.             {
  16.                 int k = rnd.Next(0, sorted.Count);                
  17.                 sorted.Remove(k);
  18.                 Console.WriteLine("Numero estratto : " + k + "  " + x);
  19.             }
  20.         }







L'apprendista di C#...
PM Quote
Avatar
el borto (Normal User)
Rookie


Messaggi: 47
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 14:13
Lunedì, 15/02/2010
ciao secondo me stai prendendo la via più lunga e difficile infatti basterebbe :
1) crearti una variabile di tipo random (es. Random r= new Random());
2) per ottenere un numero random basta fare r.Next(), se devi estrarre un numero compreso  tra 1 e 32 basta fare: r.Next() % 32 +1;
3) Per quanto riguarda il fatto di non dover far riuscire un numero basta salvare il numero estratto in un vettore e poi con un ciclo for basta far passare il vettore e vedere se il nuovo numero estratto è già presente nel vettore rifai l'estrazione altrimenti utilizzi il numero e lo salvi nel vettore ;

PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1844
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 14:18
Lunedì, 15/02/2010
Testo quotato

Postato originariamente da el borto:

ciao secondo me stai prendendo la via più lunga e difficile infatti basterebbe :
1) crearti una variabile di tipo random (es. Random r= new Random());
2) per ottenere un numero random basta fare r.Next(), se devi estrarre un numero compreso  tra 1 e 32 basta fare: r.Next() % 32 +1;
3) Per quanto riguarda il fatto di non dover far riuscire un numero basta salvare il numero estratto in un vettore e poi con un ciclo for basta far passare il vettore e vedere se il nuovo numero estratto è già presente nel vettore rifai l'estrazione altrimenti utilizzi il numero e lo salvi nel vettore ;



un algoritmo del genere andrebbe proprio al caso tuo

Codice sorgente - presumibilmente C++

  1. Random rnd = new Random();
  2.  
  3.             int n = rnd.Next(0, Numeri.Count);
  4.  
  5.             for (int i = 0; i < 90; i++)
  6.             {
  7.                 for (int j = 0; j < Numeri_estratti.Count; j++)
  8.                 {
  9.                     if (n != Numeri_estratti[j])
  10.                     {
  11.                         Numeri_estratti.Add(n);
  12.                     }
  13.                 }
  14.             }



PM Quote
Avatar
sps84 (Normal User)
Pro


Messaggi: 199
Iscritto: 11/02/2009

Segnala al moderatore
Postato alle 23:54
Lunedì, 15/02/2010
Finalmente ci sono riuscito, non ho utilizzato il tuo metodo ma ho provato a farne uno mio. Sembra funzionare

Codice sorgente - presumibilmente C++

  1. int[] numeriEstratti = new int[90];
  2.            
  3.             Random rnd = new Random();
  4.  
  5.             int giro = 6;
  6.  
  7.             for (int x = 0; x < giro; x++)
  8.             {
  9.                 int n = rnd.Next(1, 90);//estraggo i numeri
  10.  
  11.                 if (n != numeriEstratti[n])
  12.                 {
  13.                     numeriEstratti[n] = n;
  14.                     Console.WriteLine(n);
  15.                 }
  16.                 else
  17.                 {
  18.                     giro++;
  19.                 }
  20.  
  21.             }



Accetto suggerimenti.Grazie a tutti.:heehee::heehee:


L'apprendista di C#...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:14
Martedì, 16/02/2010
L'ultimo sorgente postato è un po' confusionario: confondi gli indici con il valore della cella. Anche se in questo caso particolare ciò non fa molta differenza, poiché qualsiasi numero diverso da zero indica un valore vero...

La prima soluzione non era sbagliata del tutto. Possiamo riadattarla così:
Codice sorgente - presumibilmente VB.NET

  1. Dim Numbers As List(Of Int32) = Enumerable.Range(1, 90).ToList()
  2. Dim Extracted As New List(Of Int32)
  3. Dim Rnd As New Random()
  4. Dim K As Int32
  5.  
  6. For I As Int32 = 1 to 6
  7.    K = Numbers(Rnd.Next(0, 90))
  8.    Extracted.Add(K)
  9.    Numbers.Remove(K)
  10. Next



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
sps84 (Normal User)
Pro


Messaggi: 199
Iscritto: 11/02/2009

Segnala al moderatore
Postato alle 23:53
Giovedì, 18/02/2010
Testo quotato

Postato originariamente da Il Totem:

L'ultimo sorgente postato è un po' confusionario: confondi gli indici con il valore della cella. Anche se in questo caso particolare ciò non fa molta differenza, poiché qualsiasi numero diverso da zero indica un valore vero...

La prima soluzione non era sbagliata del tutto. Possiamo riadattarla così:
Codice sorgente - presumibilmente VB.NET

  1. Dim Numbers As List(Of Int32) = Enumerable.Range(1, 90).ToList()
  2. Dim Extracted As New List(Of Int32)
  3. Dim Rnd As New Random()
  4. Dim K As Int32
  5.  
  6. For I As Int32 = 1 to 6
  7.    K = Numbers(Rnd.Next(0, 90))
  8.    Extracted.Add(K)
  9.    Numbers.Remove(K)
  10. Next




io ho provato a tradurlo cosi

Codice sorgente - presumibilmente C# / VB.NET

  1. List<Int32> numbers = Enumerable.Range(1,20).ToList();
  2.             List<Int32> numEstratti = new List<Int32>();
  3.             Random rnd = new Random();
  4.             Int32 k;
  5.  
  6.             for (Int32 x = 0; x < 10; x++)
  7.             {
  8.                 k = numbers[rnd.Next(1, 20)];
  9.                 numEstratti.Add(k);
  10.                 numbers.Remove(k);
  11.                 Console.WriteLine(k + " ");
  12.            
  13.             }



Dato che il listato mi serve per estrami i numeri per il winforlife
:heehee::heehee::heehee: il range è 20 ed i numeri da estrarre sono 10
mi da errore outofrangexception  l'errore è nella prima riga perchè mi estrae anche numeri superiori a 20


L'apprendista di C#...
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:09
Venerdì, 19/02/2010
Certo, certo, me ne sono accorto quando ero a letto, ma non ho avuto tempo di postare XD Ovviamente Next non va fino a 20 (o 90), ma solo fino a Numbers.Count.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote