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
Visual Basic 6 - Random sbagliato
Forum - Visual Basic 6 - Random sbagliato

Avatar
erreesse (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/08/2010

Segnala al moderatore
Postato alle 15:23
Lunedì, 23/08/2010
Vorrei porre un quesito
Ringrazio chi mi può aiutare
uso VB 6
Ho questa matrice
dim N (1 to 6) as integer 'matrice di numeri

con questi numeri.
N(1) = 2
N(2) = 19
N(3) = 83
N(4) = 65
N(5) = 11
N(6) = 74

una volta che ho la matrice piena ho creato un random
che prelevi i numeri solo da questa matrice N(), E le vadi a scrivere in uno schema
fatto di 9 Label1(index).
'-------------------------------

Questo è il codice che ho usato
-----------------------------------------------------------------

Dim N(1 To 9) As Integer  'matrice di numeri


Private Sub Command1_Click()


Randomize
N(1) = 2
N(2) = 19
N(3) = 83
N(4) = 65
N(5) = 11
N(6) = 74


' randomizo i numeri da 1 a 9

Dim X As Integer
Dim xx As Boolean
ripeti:
For y = 1 To 9
Label1(y).Caption = ""
Next
For X = 1 To 6
  xx = False
    ran = Int(9 * Rnd + 1)
    Label1(ran).Caption = N(X)
    
      
Next X
    ss = 1
    For a = 1 To 8
      For aa = a + 1 To 9
       i = Val(Label1(a).Caption)
       ii = Val(Label1(aa).Caption)
       If i <> 0 And ii <> 0 Then
       If i = ii Then GoTo ripeti
       End If
       Next
       Next


End Sub




ho un pulsante e nove label1 con index da 1 a 9

adesso ogni volta che premo sul pulsante TUTTI I 6 numeri si dovrebbero colocare in
modo casuale sui label. Ma questo non accade, qualche volta ne inserisce 4 qualche volta 6
dov'è lo sbaglio?
GRAZIE




PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 16:12
Lunedì, 23/08/2010
Mi ci è voluto un po' per capire il tuo ragionamento.
Dunque:
Tu scorri l'array dei tuoi numeri, da 1 a 6, e scegli random l'indice della label a cui attribuire il valore.
Per cui fai 6 attribuzioni.
Poi controlli le label e se ce ne sono uguali ripeti dall'inizio.
Bene che va, cioè sei label diverse in partenza, tutto si ferma.

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 17:34
Lunedì, 23/08/2010
Testo quotato

Postato originariamente da erreesse:

Vorrei porre un quesito
Ringrazio chi mi può aiutare
uso VB 6
Ho questa matrice
dim N (1 to 6) as integer 'matrice di numeri

con questi numeri.
N(1) = 2
N(2) = 19
N(3) = 83
N(4) = 65
N(5) = 11
N(6) = 74

una volta che ho la matrice piena ho creato un random
che prelevi i numeri solo da questa matrice N(), E le vadi a scrivere in uno schema
fatto di 9 Label1(index).
'-------------------------------

Questo è il codice che ho usato
-----------------------------------------------------------------

Dim N(1 To 9) As Integer  'matrice di numeri


Private Sub Command1_Click()


Randomize
N(1) = 2
N(2) = 19
N(3) = 83
N(4) = 65
N(5) = 11
N(6) = 74


' randomizo i numeri da 1 a 9

Dim X As Integer
Dim xx As Boolean

ripeti:
For y = 1 To 9
Label1(y).Caption = ""
Next

For X = 1 To 6
  xx = False
    ran = Int(9 * Rnd + 1)
    Label1(ran).Caption = N(X)      
Next X


    ss = 1
    For a = 1 To 8
      For aa = a + 1 To 9
       i = Val(Label1(a).Caption)
       ii = Val(Label1(aa).Caption)
       If i <> 0 And ii <> 0 Then
       If i = ii Then GoTo ripeti
       End If
       Next
       Next


End Sub




ho un pulsante e nove label1 con index da 1 a 9

adesso ogni volta che premo sul pulsante TUTTI I 6 numeri si dovrebbero colocare in
modo casuale sui label. Ma questo non accade, qualche volta ne inserisce 4 qualche volta 6
dov'è lo sbaglio?
GRAZIE






Il codice che hai scritto non è completo, ss=1 a cosa ti serve, xx=False a cosa ti serve.


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
erreesse (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/08/2010

Segnala al moderatore
Postato alle 23:10
Lunedì, 23/08/2010
per Alfonso giusto così. le label sono nove ne dovrebbe lasciare
3 vuote e 6 piene.
Dimenticavo nessun numero deve essere ripetuto.


Per ultimo, invece la xx  e s non servono, erano prove fatte in precedenza
ho provato con un paio di codici prelevato anche da questo forum, e da
un sito inglese.






PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 23:21
Lunedì, 23/08/2010
Ti consiglio questo semplice algoritmo che in sei passaggi estrae random i 6 numeri senza ripetizioni.
Codice sorgente - presumibilmente VB.NET

  1. For x = 1 To 9
  2.   Label1(x).Caption = ""
  3. Next
  4.  
  5. n(1) = 2
  6. n(2) = 19
  7. n(3) = 83
  8. n(4) = 65
  9. n(5) = 11
  10. n(6) = 74
  11.  
  12. i = 6
  13. Do While i > 0
  14.    t = Int(i * Rnd + 1)    '  estrae il valore tra 1 e i
  15.    Label1(i).Caption = n(t)' attribuisce il valore contenuto nell'array n(t)
  16.    If t <> i Then ' se non è l'ultimo valore dell'array considerato
  17.         n(t) = n(i) ' scambia l'ultimo con quello estratto
  18.    End If
  19.    i = i - 1 ' non considera più l'ultimo array
  20. Loop


Ultima modifica effettuata da Alfonso il 23/08/2010 alle 23:29
PM Quote
Avatar
erreesse (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/08/2010

Segnala al moderatore
Postato alle 12:52
Martedì, 24/08/2010
Testo quotato

Postato originariamente da Alfonso:

Ti consiglio questo semplice algoritmo che in sei passaggi estrae random i 6 numeri senza ripetizioni.
Codice sorgente - presumibilmente VB.NET

  1. For x = 1 To 9
  2.   Label1(x).Caption = ""
  3. Next
  4.  
  5. n(1) = 2
  6. n(2) = 19
  7. n(3) = 83
  8. n(4) = 65
  9. n(5) = 11
  10. n(6) = 74
  11.  
  12. i = 6
  13. Do While i > 0
  14.    t = Int(i * Rnd + 1)    '  estrae il valore tra 1 e i
  15.    Label1(i).Caption = n(t)' attribuisce il valore contenuto nell'array n(t)
  16.    If t <> i Then ' se non è l'ultimo valore dell'array considerato
  17.         n(t) = n(i) ' scambia l'ultimo con quello estratto
  18.    End If
  19.    i = i - 1 ' non considera più l'ultimo array
  20. Loop




Grazie Alfonso provo il codice e ti faccio sapere.

PM Quote
Avatar
erreesse (Normal User)
Newbie


Messaggi: 6
Iscritto: 02/08/2010

Segnala al moderatore
Postato alle 13:29
Martedì, 24/08/2010
Per Alfonso
Ti ringrazio per avermi aiutato a capire il modo di estrarre da un'array
con poco codice. Avevo trovato un sacco di esempi sul web ma niente che mi potesse
essere utile.

Il codice va bene. Solo che leggendo post mi sono accorto di non aver dato le dovute spiegazioni all'inizio. Colpa della fretta. Infatti, facevo il random delle caselle,
perchè non volevo, che i numeri si disponessero nelle label in modo sequenziale..
label1(1), label1(2) ecc. ecc.
Ma anche per questi in modo casuale. Infatti usavo 9 label.

Ho risolto aggiungendo 3 nuovi numeri  0 0 0, senza cambiare il tuo codice



Private Sub Command2_Click()
For X = 1 To 9
  Label1(X).Caption = ""
Next

N(1) = 2
N(2) = 19
N(3) = 83
N(4) = 65
N(5) = 11
N(6) = 74
N(7) = 0
N(8) = 0
N(9) = 0

i = 9
Do While i > 0
   t = Int(i * Rnd + 1)    '  estrae il valore tra 1 e i
   Label1(i).Caption = N(t) ' attribuisce il valore contenuto nell'array n(t)
   If t <> i Then ' se non è l'ultimo valore dell'array considerato
        N(t) = N(i) ' scambia l'ultimo con quello estratto
   End If
   i = i - 1 ' non considera più l'ultimo array
Loop

End Sub

Ti ringrazio nuovamente.

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 14:49
Martedì, 24/08/2010
In effetti non ti eri spiegato benissimo!
Il metodo che hai scelto è perfetto.
Il prossimo messaggio che dovesse contenere codice, ricordati di racchiudere il codice tra i tag code.
Ciao

Ultima modifica effettuata da Alfonso il 24/08/2010 alle 14:51
PM Quote