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 - [vb.net] Numeri Casuali es escludere quelli già usciti
Forum - C# / VB.NET - [vb.net] Numeri Casuali es escludere quelli già usciti

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 14:14
Mercoledì, 14/10/2009
salve a tutti sto scrivendo un programma che genera 15 numeri casuali attraverso questo codice:
Codice sorgente - presumibilmente VB.NET

  1. Dim numeri As New Random
  2. Dim i As Integer = 0
  3.         For i = 1 To 15
  4.             numeroestratto = numeri.Next(1, 30)
  5.         Next i



Come faccio a escludere i numeri già usciti ?

Grazie

PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 14:46
Mercoledì, 14/10/2009
Testo quotato

Postato originariamente da swet:
Come faccio a escludere i numeri già usciti ?


Puoi farlo in molti modi.
Semplicemente puoi aggiungere ogni numero che estrai ad una List, dopo aver controllato (con la funzione List.Contains()) che il numero non sia già presente. Se invece lo è, ripeti il Random.Next().

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 15:31
Mercoledì, 14/10/2009
Ciao grazie della risposta, ho provato con questo codice ma non cambia niente.
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         Dim rnd As New Random
  3.         Dim numero As String
  4.         For i = 1 To 15
  5.             numero = ListBox1.Items.Add(rnd.Next(1, 30))
  6.             If ListBox1.Items.Contains(numero) = true Then
  7.                 numero = ListBox1.Items.Add(rnd.Next(1, 20))
  8.             End If
  9.         Next i
  10.  
  11.  
  12.  
  13.     End Sub



Ho provato anche con quest'altro codice :

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2.         Dim rnd As New Random
  3.         Dim numero As String
  4.         Dim i As Integer = 1
  5.         For i = 1 To 10
  6.             numero = ListBox1.Items.Add(rnd.Next(1, 20))
  7.             For Each numero In ListBox1.Items
  8.                 If ListBox1.Items.Contains(numero) Then
  9.                     numero = ListBox1.Items.Add(rnd.Next(1, 20))
  10.                 End If
  11.             Next
  12.         Next i
  13.     End Sub




dove sbaglio?

Ultima modifica effettuata da swet il 14/10/2009 alle 15:41
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:04
Mercoledì, 14/10/2009
Inutile. Basta creare una lista con gli elementi da estrarre e sorteggiare un indice compreso tra 0 e Count - 1. Quindi, è sufficiente eliminare l'elemento scelto e ripetere il sorteggio tra quelli restanti (la lista conterrà un elemento in meno).

PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 19:22
Mercoledì, 14/10/2009
Testo quotato

Postato originariamente da Il Totem:

Inutile. Basta creare una lista con gli elementi da estrarre e sorteggiare un indice compreso tra 0 e Count - 1. Quindi, è sufficiente eliminare l'elemento scelto e ripetere il sorteggio tra quelli restanti (la lista conterrà un elemento in meno).


Ci avevo pensato, ma credevo che fosse pesante aggiungere tutti i numeri ad una lista. Ripensandoci però, un If è molto peggio :D

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 19:34
Mercoledì, 14/10/2009
Ciao Totem, non credo di aver capito quello che intendi , ho provato così :
Codice sorgente - presumibilmente VB.NET

  1. Dim rnd As New Random
  2.         Dim numerocasuale As String
  3.         Dim lista As ArrayList
  4.         lista = New ArrayList
  5.         'aggiunge tutti i numeri da 1 a 20 nella listbox
  6.         For i = 1 To 20
  7.             i = ++i
  8.             Lista.add(i)
  9.         Next
  10.         'estrae un indice casuale compreso tra 0 e il contatore - 1
  11.         For i = 1 To 10
  12.             ListBox1.Items.Add(rnd.Next(0, 20))
  13.             numerocasuale = rnd.Next(0, i - 1)
  14.             ListBox1.Items.Remove(numerocasuale)
  15.         Next



ma niente è cambiato... Dove sbaglio?

PM Quote
Avatar
ruggy94 (Member)
Guru


Messaggi: 890
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 19:50
Mercoledì, 14/10/2009
Una cosa del genere:
Codice sorgente - presumibilmente VB.NET

  1. Dim ListNumeri as new List(of Int16)
  2. Dim ListEstratti as new List(of Int16)
  3. Dim EstrazioneCorrente as int16
  4. Dim Rnd as new Random
  5.  
  6. private Sub CreaLista()
  7. For I as int16 = 1 to 20
  8. ListNumeri.Add(I)
  9. Next I
  10. End Sub
  11.  
  12. private Sub EstraiNumeri()
  13. For X as int16 = 0 to 9 'estrae 10 numeri differenti
  14. EstrazioneCorrente= ListNumeri(Rnd.Next(0,ListNumeri.Count))
  15. ListEstratti.Add(EstrazioneCorrente)
  16. ListNumeri.Remove(EstrazioneCorrente)
  17. Next X
  18. End sub


Chiaramente puoi cambiare tutti i valori a seconda delle tue esigenze.
Inoltre mi scuso anticipatamente per gli errori che posso aver commesso, dato che ho scritto il codice senza l'IDE e quindi non l'ho nemmeno testato ;)

PM Quote
Avatar
swet (Normal User)
Pro


Messaggi: 128
Iscritto: 01/01/2009

Segnala al moderatore
Postato alle 23:37
Mercoledì, 14/10/2009
grazie l' ho riadattato e adesso funziona per potresti spiegarmi cosa significa questa linea? Cosa fa ? grazie!

Codice sorgente - presumibilmente Plain Text

  1. EstrazioneCorrente= ListNumeri(Rnd.Next(0,ListNumeri.Count))





PM Quote
Avatar
GoLDBeRG (Ex-Member)
Expert


Messaggi: 331
Iscritto: 19/12/2005

Segnala al moderatore
Postato alle 8:58
Giovedì, 15/10/2009
ma perche usare list next cioe vi complicate la vita....
nn era meglio fare una cosa del genere

arraylist pippo
0
1
2
3
4
5
6
7
8
9

dim pippo2 as new arraylist

randomize()

for g as integer=0 to 10
riprova:
dim casuale as integer=math.round(rnd*pippo.count-1)
if pippo2.contains(casuale)=false then
pippo2.add(casuale)
HO IL NUMERO NON ANCORA USCITO
else
goto riprova
end if
next

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo