Problema ordenando array al azar

Iniciado por $Edu$, 27 Septiembre 2011, 17:55 PM

0 Miembros y 1 Visitante están viendo este tema.

$Edu$

Es una boludez lo que no puedo hacer, el problema estara en como creo el random, ya que no se si sale el 0 y tambien me confundo con .net lo que pasa porque hacia mucho que no tocaba vb6 y digo esto porque talvez tengo problemas con los bucles con los valores posibles de i

Esto que dejo crea un bucle infinito dentro del do-loop while y la idea es que tome los items del listbox y los meta al azar en el array nombre()

Código (vb) [Seleccionar]

Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim sigue As Boolean
Dim ran As Integer

ReDim Equipo(frmChampion.ListNombre.ListCount)
ReDim Nombre(frmChampion.ListNombre.ListCount)

Cant = frmChampion.ListNombre.ListCount

For i = 0 To UBound(Nombre)

    Do
         Randomize
         ran = Int(Rnd() * Cant + 1)

    Loop While Nombre(ran) <> vbNullString

    Nombre(ran) = frmChampion.ListNombre.List(i)

    For j = 0 To Cant
         If Nombre(j) = vbNullString Then
             sigue = True
         End If

    Next

    If sigue = False Then
        Exit For
    End If

Next

For j = 0 To UBound(Nombre)
    Debug.Print Nombre(j)
Next

End Sub

79137913

#1
HOLA!!!

Usa esta funcion:
Código (vb) [Seleccionar]
Private Function RandomizeArray7913(arr() As Long) As Long()
'cambiar      ACA-v    abajo*        ACA-^    ACA-^ para cambiar el tipo
Dim auxArr() As Long
Dim pos As Long
Dim lb As Long
Dim ub As Long
Dim ct As Long
   Randomize Timer
   ct = lb
   lb = LBound(arr)
   ub = UBound(arr)
   ReDim auxArr(lb To ub)
   pos = Int(Rnd() * (ub - lb + 1 )) + lb
   auxArr(pos) = arr(ct)
   ct = ct + 1
   While ct <= ub
       pos = Int(Rnd() * (ub - lb + 1 )) + lb
       While auxArr(pos) <> 0 'PARA VARIANT NOT ISEMPTY(AUXARR(POS)) PARA STRING AUXARR (POS) <> ""
           pos = Int(Rnd() * (ub - lb + 1 )) + lb
       Wend
       auxArr(pos) = arr(ct)
       ct = ct + 1
   Wend
   RandomizeArray7913 = auxArr
End Function


Asi se usa:
Código (vb) [Seleccionar]
Private Sub Form_Load()
Dim a(9) As Long
Dim b() As Long

For x = 0 To 9
a(x) = x
Next
b = RandomizeArray7913(a)
For x = LBound(b) To UBound(b)
   Debug.Print b(x)
Next
End Sub


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

BlackZeroX

The Dark Shadow is my passion.

$Edu$

Gracias por las molestia pero me sigue creando un bucle infinito y tengo que terminar la aplicacion.
Si pueden mirar mi codigo que esta bien entendible pienso y me dicen que hice mal, les agradezco

ignorantev1.1

Código (vb) [Seleccionar]


Cant = frmChampion.ListNombre.ListCount //Supongamos que es 8 (0 a 7)

For i = 0 To UBound(Nombre)

    Do
         Randomize
         ran = Int(Rnd() * Cant + 1)
'Tienes una lista con 8 campos (0 a 7), al hacer Rnd*8 el numero maximo será 7
'Pero como le sumas 1, RAN podría valer 8, que sería un valor fuera de rango.

    Loop While Nombre(ran) <> vbNullString
'El ciclo se romperá "por suerte" :D, podrían salir solo 4's, 6's o 2's en cuyos
'campos siempre habría una cadena valida, lo que permitiría la inmortalidad del ciclo.


Saludos!

$Edu$

Como? mi idea con ese bucle es que genere numeros hasta que nombre(esenumero) no contenga nada, asi le pone el valor del item i
O lo estoy haciendo mal? no te entendi bien, dime q puedo cambiar ahi.

BlackZeroX

The Dark Shadow is my passion.

$Edu$

Alguien que me diga la parte del codigo mio que esta mal?

$Edu$

#8
Ya pude, le cambie lo que dijo Ignorante, de quitarle el + 1 que yo habia puesto que ya ni me acuerdo porque.
Y le puse que los bucles sean hace ubound(nombre) -1

Pero ahora.. la gran pregunta.. porque? Si yo creo un array(6) , el ubound(array) sera igual a 6? no tendria que ser igual a 5? Cometi ese error que tendria que saberlo no se porque me confundo cuando programo en C# y luego paso a vb6, si todos los arrays se inician en 0 y es lo mismo, o no se , si alguien me explica esto re basico, le agradezco.


Ya me explicaron y mi confuncion fue porque en C# al hacer:

Código (csharp) [Seleccionar]

string[] hola = new string[6]


El array hola ira desde 0 to 5

Sin embargo en vb6

Código (vb) [Seleccionar]

dim hola(6) as string


El array hola ira desde 0 to 6 no?

ignorantev1.1

Código (vb) [Seleccionar]
dim hola(6) as string
No, estás reservando 6 campos, 0 al 5.
Creo que en C# es lo mismo quen en VB. Casi todos los arrays inician en 0, a menos que especifiques lo contrario:

Citarmiarray(1 to 6)

Saludos!