Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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)
Expert


Messaggi: 202
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.         }






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 (Admin)
Guru^2


Messaggi: 2253
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)
Expert


Messaggi: 202
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:

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


PM Quote
Avatar
sps84 (Normal User)
Expert


Messaggi: 202
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

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.

PM Quote