Oppure

Loading
14/02/10 22:10
sps84
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


static void Main(string[] args)
        {
            SortedList sorted = new SortedList();
            for (int x = 0; x < 20; x++)
            {
                sorted.Add(x, x);
            }
            sorted.Remove(1);
            for (int x = 1; x < 11; x++ )
            {
                Console.WriteLine(sorted.GetByIndex(x));
            }
            Random rnd = new Random(unchecked((int)DateTime.Now.Ticks));
            for (int x = 1; x < 11; x++)
            { 
                int k = rnd.Next(0, sorted.Count);                
                sorted.Remove(k);
                Console.WriteLine("Numero estratto : " + k + "  " + x);
            }
        }




aaa
15/02/10 13:13
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 ;
aaa
15/02/10 13:18
Thejuster
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


Random rnd = new Random();

            int n = rnd.Next(0, Numeri.Count);

            for (int i = 0; i < 90; i++)
            {
                for (int j = 0; j < Numeri_estratti.Count; j++)
                {
                    if (n != Numeri_estratti[j])
                    {
                        Numeri_estratti.Add(n);
                    }
                }
            }

mire.forumfree.it/ - Mire Engine
C# UI Designer
15/02/10 22:54
sps84
Finalmente ci sono riuscito, non ho utilizzato il tuo metodo ma ho provato a farne uno mio. Sembra funzionare


            int[] numeriEstratti = new int[90];
            
            Random rnd = new Random();

            int giro = 6;

            for (int x = 0; x < giro; x++)
            {
                int n = rnd.Next(1, 90);//estraggo i numeri

                if (n != numeriEstratti[n])
                {
                    numeriEstratti[n] = n;
                    Console.WriteLine(n);
                }
                else 
                {
                    giro++;
                } 

            }



Accetto suggerimenti.Grazie a tutti.:heehee::heehee:
aaa
16/02/10 13:14
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ì:
Dim Numbers As List(Of Int32) = Enumerable.Range(1, 90).ToList()
Dim Extracted As New List(Of Int32)
Dim Rnd As New Random()
Dim K As Int32

For I As Int32 = 1 to 6
   K = Numbers(Rnd.Next(0, 90))
   Extracted.Add(K)
   Numbers.Remove(K)
Next
aaa
18/02/10 22:53
sps84
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ì:
Dim Numbers As List(Of Int32) = Enumerable.Range(1, 90).ToList()
Dim Extracted As New List(Of Int32)
Dim Rnd As New Random()
Dim K As Int32

For I As Int32 = 1 to 6
   K = Numbers(Rnd.Next(0, 90))
   Extracted.Add(K)
   Numbers.Remove(K)
Next


io ho provato a tradurlo cosi


            List<Int32> numbers = Enumerable.Range(1,20).ToList();
            List<Int32> numEstratti = new List<Int32>();
            Random rnd = new Random();
            Int32 k;

            for (Int32 x = 0; x < 10; x++)
            {
                k = numbers[rnd.Next(1, 20)];
                numEstratti.Add(k);
                numbers.Remove(k);
                Console.WriteLine(k + " ");
            
            }



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
aaa
19/02/10 10:09
Il Totem
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.
aaa