
sps84 (Normal User)
Expert
    
Messaggi: 202
Iscritto: 11/02/2009
|
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++ |
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); } }
|
|
|

el borto (Normal User)
Rookie
    
Messaggi: 47
Iscritto: 19/07/2009
|
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 ;
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2253
Iscritto: 04/05/2008
|
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++ |
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); } } }
|
|
|

sps84 (Normal User)
Expert
    
Messaggi: 202
Iscritto: 11/02/2009
|
Finalmente ci sono riuscito, non ho utilizzato il tuo metodo ma ho provato a farne uno mio. Sembra funzionare
Codice sorgente - presumibilmente C++ |
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. 
|
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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 |
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
|
|
|

sps84 (Normal User)
Expert
    
Messaggi: 202
Iscritto: 11/02/2009
|
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 |
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
Codice sorgente - presumibilmente C# / VB.NET |
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
   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 |
|

Il Totem (Admin)
Guru^2
    
Messaggi: 3635
Iscritto: 24/01/2006
|
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.
|
|