Italian Cicli diversi

Antonyx

Member
Ciao a tutti volevo chiedere un consiglio su un app. che stò sviluppando con b4a.L'app consiste in un generatore di numeri casuali in 10 label diverse (tipo gioco 10 e lotto) l'unico problema che riscontro e che capita che in due o piu label sortisce lo stesso numero.Come posso risolvere.Grazie 1000
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Non dovrebbe essere difficile riscrivere il codice seguente in VB6
Option Explicit

Private Sub Form_Load()
Dim c As Long
Dim s As String
Dim i As Long
c = enrnd(1, 99)
s = CStr(c)
For i = 0 To 10
s = s & " " & CStr(enrnd)
Next
MsgBox s
End
End Sub

Public Function enrnd(Optional min As Long = 0, Optional max As Long = 0) As Long
Dim nex As Long
Static v() As Boolean
Static mn As Long
Static mx As Long
Static it As Long

If max <> 0 Then
ReDim v(max) As Boolean
mn = min
mx = max
it = max - min
End If

If mx = 0 Or it = 0 Then enrnd = -1: Exit Function

Randomize
Do
nex = Rnd * (mx - mn) + mn
Loop While v(nex)

v(nex) = True
it = it - 1
enrnd = nex
End Function
L'idea (non mia; qui la fonte http://forum.masterdrive.it/visual-basic-6-17/rnd-numero-non-ripetuto-72144/ ) è valida e funziona.
 

LucaMs

Expert
Licensed User
Longtime User
La tecnica più usata è (la scrivo direttamente, quindi potrebbe contenere errori):

B4X:
dim MaxNum as Int = 90
dim arrDisponibili(MaxNum + 1) as Int
dim NumDisp as int
dim Buffer as int
For N = 1 to MaxNum
  arrDisponibili(N) = N
next

Sub Estrazione
   NumDisp = MaxNum
   dim x as int
   For I = 0 to NumDiLbls - 1 ' numero di estratti sarebbe meglio
     x = Rnd(1, NumDisp + 1)
     lblNum(I).text = arrDisponibili(x)

     ' Swap - scambio tra l'ultimo disponibile e quello estratto
     Buffer = arrDisponibili(x)
     arrDisponibili(x) = arrDisponibili(NumDisp)
     arrDisponibili(NumDisp) = Buffer

     NumDisp = NumDisp - 1
   Next
End Sub

ops, stavo scrivendo mentre AlpVir aveva già postato :)

Se per caso non funzionasse bene, è per via dei +1, della base 0 dell'array, etc. CONTROLLA!!!

Cmq, la "strategia" sta nell'avere una array (ma puoi usare anche una List ordinata!) con tutti i valori disponibili, randomizzare un INDICE tra 1 e 90 (in questo caso), prelevare il valore dall'array per quel dato indice (che è l'ESTRATTO), scambiare di posto l'ultimo elemento dell'array con quello che corrisponde all'indice (usando un buffer per lo scambio) e "dire" alla routine che adesso i valori disponibili sono ogni volta uno in meno, in modo che gli ultimi della lista non vengano estratti di nuovo)
 
Last edited:

Antonyx

Member
Ciao e grazie a tutti per l'interessamento al mio problema.Forse quello di Sprint e interessante,infatti e quello che avevo pensato io ma non saprei come dirlo a b4a.In pratica se la label1 e uguale alla label 2 effettua ancora un random,oppure se la label1 e uguale la label2,la label2 deve essere diversa dalla label1.Spero di risolvere al piu presto e sopratutto di poter essere utile a qualcun'altro.Grazie ancora:p
 

Antonyx

Member
Come non detto ho provato con "if label1.text=label2.text then label2.text=rnd(1,91)" e label2 mi da 0.....uff.
 

LucaMs

Expert
Licensed User
Longtime User
Ho testato il mio codice e funziona (mancava una dichiarazione, l'ho modificato).

Se aggiungi il codice seguente, vedrai che funziona. Solo che i numeri non sono ordinati, per questo sarebbe meglio usare una List anziché un array.

B4X:
' Nella Sub Globals
    Dim Label1 As Label
    Dim Label2 As Label
    Dim Label3 As Label
    Dim Label4 As Label
    Dim Label5 As Label
    Dim Label6 As Label
    Dim Label7 As Label
    Dim Label8 As Label
    Dim Label9 As Label
    Dim Label10 As Label

    Dim LabelList As List

' Nella Activity_Create
    LabelList.Add(Label1)
    LabelList.Add(Label2)
    LabelList.Add(Label3)
    LabelList.Add(Label4)
    LabelList.Add(Label5)
    LabelList.Add(Label6)
    LabelList.Add(Label7)
    LabelList.Add(Label8)
    LabelList.Add(Label9)
    LabelList.Add(Label10)
   
    For N = 1 To MaxNum
      arrDisponibili(N) = N
    Next

Sub Estrazione
  NumDisp = MaxNum
    Dim x As Int
    Dim lbl As Label
  For I = 0 To LabelList.Size - 1 ' numero di estratti sarebbe meglio
    x = Rnd(1, NumDisp + 1)
      lbl = LabelList.Get(I)
    lbl.text = arrDisponibili(x)

    ' Swap - scambio tra l'ultimo disponibile e quello estratto
    Buffer = arrDisponibili(x)
    arrDisponibili(x) = arrDisponibili(NumDisp)
    arrDisponibili(NumDisp) = Buffer

    NumDisp = NumDisp - 1
  Next
End Sub
 

LucaMs

Expert
Licensed User
Longtime User
Io ho la v. 3.00 di B4A, tu immagino la 3.20. Se c'è compatibilità con la precedente, prova questo (con List ordinata).
(per la visualizzazione potresti usare una Listview, anziché le label).
 

Attachments

  • lm_10Lotto.zip
    8.1 KB · Views: 183

Antonyx

Member
Ciao e grazie.Dunque nell'app devo inserire una listview o una label che funge da lista.Numdisp i senso di dispari? e se e cosi, i pari?.Il ciclo for lo inserisco nell'acitvity? Vorrei provare a inviarti il mio codice come si fa, cosi potrai capire meglio (anche se penso che non e il caso perche hai capito)e grazie ancora
 

LucaMs

Expert
Licensed User
Longtime User
Non riesci a caricare l'esempio che ho postato? (dammi una conferma, così capisco se c'è compatibilità tra versioni precedenti e successive di B4A).

No, ho messo NumDisp per Numeri Disponibili (in effetti può dare origine a confusione).

upload_2014-2-16_8-36-16.png


Ti consigliavo di usare una ListView al posto delle 10 label perché è più comoda da gestire, ma va benissimo anche con le label.

Per postare il tuo progetto, vai nel menu File - voce Export as Zip, poi lo alleghi al tuo post usando il tasto qui sotto "Upload a file".


P.S. mi è stato confermato da Erel: i progetti sviluppati con versioni + vecchie girano sulle nuove
 
Last edited:

Antonyx

Member
Ciao Luca. L'idea della listview non e male. Per il resto proverò al piu presto il tuo codice e ti farò sapere anche se preferivo di qualcosa piu semplice tipo la label1 deve essere diversa dalla label2 dalla label3 e cosi via (in linguaggio basic e ovvio) comunque seguirò il tuo esempio perché di sicuro sei piu esperto di me. Ciao a presto
 
Top