Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Junio 29, 2011, 07:07:47 pm
-
Hola de nuevo amigos, estoy queriendo generar: "números aleatorio", "ordenar por columna" y "verificar si ya existe".
La matriz del bingo se compone así: del numero 1 al 75, hay varios tipos de bingo. pero el que ahora quiero es este.
linea de B: compone del 01 al 15
linea de I : compone del 16 al 30
linea de N: compone del 31 al 45
linea de G: compone del 46 al 60
linea de O: compone del 61 al 75
Acá un ejemplo de una matriz.
01*02*10*11*13*16*17*18*25*29*32*34*35*41*45*46*47*56*58*59*61*62*72*73*74
06*07*11*14*15*16*19*24*25*29*32*34*35*38*43*53*54*57*59*60*63*67*69*73*75
LINEA B: 06*07*11*14*15*
LINEA I : 16*19*24*25*29*
LINEA N: 32*34*35*38*43*
LINEA G: 53*54*57*59*60*
LINEA O: 63*67*69*73*75*
-
Hola, fijate si te sirve este ejemplo que arme, esta hecho rapidamente, pero parece que funciona, genera los aleatorios y respeta los valores limites de cada linea.
Private Sub Command1_Click()
Dim vNumero As Integer
Dim vMinimo As Integer, vMaximo As Integer
Dim vCadena As String
Dim vFila As Integer, vColumna As Integer
For vFila = 1 To 5 'Filas
vMinimo = IIf(vFila = 1, 1, ((vFila - 1) * 15) + 1)
vMaximo = (vFila * 15)
Dim ret() As Variant
ret = Generar(vMaximo, vMinimo, 5)
For vColumna = 0 To 4 'Columnas
vCadena = vCadena & ret(vColumna) & vbTab
Next vColumna
vCadena = vCadena & vbNewLine
Next vFila
Debug.Print vCadena
End Sub
Public Function Generar(ByVal pMaximo As Integer, Optional ByVal pMinimo As Integer = 1, Optional ByVal pCantidad As Integer = 1) As Variant
Dim x As Integer, n As Integer
Dim arrNumeros() As Variant
Dim vCollecion As New Collection
ReDim arrNumeros(pCantidad - 1)
With vCollecion
For x = pMinimo To pMaximo
.Add x
Next x
For x = 0 To pCantidad - 1
n = NumeroAleatorio(0, vCollecion.Count + 1)
arrNumeros(x) = vCollecion(n)
vCollecion.Remove n
Next x
End With
Set vCollecion = Nothing
Generar = arrNumeros
End Function
Public Function NumeroAleatorio(ByVal pMaximo As Integer, ByVal pMinimo As Integer) As Integer
Randomize
NumeroAleatorio = Int((pMaximo - pMinimo + 1) * Rnd + pMinimo)
End Function
usa esa funcion para poder alamcenar los numeros ya generados en la linea y que no se repita el numero aleatorio generado por linea.
saludos.
-
seba123neo Funciona muy bien ahora veo como ordenar cada columna en forma ascendente por que me genera así:
12*14*02*10*13*
16*28*24*30*29*
37*41*33*42*38*
49*55*50*54*52*
67*71*72*74*66*
12*14*02*10*13*16*28*24*30*29*37*41*33*42*38*49*55*50*54*52*67*71*72*74*66*
al ordenar tiene que quedar así:
02*10*12*13*14*16*24*28*29*30*33*37*38*41*42*49*50*52*54*55*66*67*71*72*74*
02*10*12*13*14
16*24*28*29*30
33*37*38*41*42
49*50*52*54*55
66*67*71*72*74
Te agradezco, Saludos...
-
Hola Ariel.
Bueno, para ordenar puedes usar el método burbuja (el que te comente en msn), que consiste en intercambiar al mayor por el menor en cada recorrido. Siguiendo y adaptándolo al ejemplo que te dio sebas, este código va dentro de su función Generar, después del With vCollecion y antes de Set vCollecion = Nothing
Next x
End With '<--- Viene de Codigo de Sebas
'/----------------------- ORDENAMIENTO -----------------------
Dim i, j, z As Integer
For i = 0 To (UBound(arrNumeros) - 1)
For j = 0 To (UBound(arrNumeros) - 1)
If arrNumeros(j) > arrNumeros(j + 1) Then
z = arrNumeros(j)
arrNumeros(j) = arrNumeros(j + 1)
arrNumeros(j + 1) = z
End If
Next j
Next i
'---------------------------------------------------------------/
Set vCollecion = Nothing <---- sigue codigo de Sebas
Generar = arrNumeros
Y te ordenara cada linea de tu BINGO. Espero que con esto tengas resuelto tu tema.
-
Va quedando Ariel ahora solo habria que hacer una verificacion de que no este ya creada una sequencia igual antes y listo no?
-
Hola disculpen por revivir el post. Quiero modificar el código que me paso el amigo Seba. Lo que quiero hacer es que que solo me cree una matriz de 25 numero con 3 columnas
ASI:
linea de B: compone del 01 al 05
linea de I : compone del 06 al 10
linea de N: compone del 11 al 15
linea de G: compone del 16 al 20
linea de O: compone del 21 al 25
Acá un ejemplo de una matriz.
01*03*05*06*08*09*12*14*15*16*17*20*21*23*25
LINEA B: 01*03*05*
LINEA I : 06*08*09*
LINEA N: 12*14*15*
LINEA G: 16*17*20*
LINEA O: 21*23*25*
-
Private Sub Command1_Click()
Dim vNumero As Integer
Dim vMinimo As Integer, vMaximo As Integer
Dim vCadena As String
Dim vFila As Integer, vColumna As Integer
For vFila = 1 To 3 'Filas
vMinimo = IIf(vFila = 1, 1, ((vFila - 1) * 5) + 1)
vMaximo = (vFila * 5)
Dim ret() As Variant
ret = Generar(vMaximo, vMinimo, 3)
For vColumna = 0 To 2 'Columnas
vCadena = vCadena & ret(vColumna) & vbTab
Next vColumna
vCadena = vCadena & vbNewLine
Next vFila
Debug.Print vCadena
End Sub
Public Function Generar(ByVal pMaximo As Integer, Optional ByVal pMinimo As Integer = 1, Optional ByVal pCantidad As Integer = 1) As Variant
Dim x As Integer, n As Integer
Dim arrNumeros() As Variant
Dim vCollecion As New Collection
ReDim arrNumeros(pCantidad - 1)
With vCollecion
For x = pMinimo To pMaximo
.Add x
Next x
For x = 0 To pCantidad - 1
n = NumeroAleatorio(0, vCollecion.Count + 1)
arrNumeros(x) = vCollecion(n)
vCollecion.Remove n
Next x
End With
'Incluyo el metodo burbuja que aplico Yvan...!
Dim i, j, z As Integer
For i = 0 To (UBound(arrNumeros) - 1)
For j = 0 To (UBound(arrNumeros) - 1)
If arrNumeros(j) > arrNumeros(j + 1) Then
z = arrNumeros(j)
arrNumeros(j) = arrNumeros(j + 1)
arrNumeros(j + 1) = z
End If
Next j
Next i
Set vCollecion = Nothing
Generar = arrNumeros
End Function
Public Function NumeroAleatorio(ByVal pMaximo As Integer, ByVal pMinimo As Integer) As Integer
Randomize
NumeroAleatorio = Int((pMaximo - pMinimo + 1) * Rnd + pMinimo)
End Function
Verifica Ariel...!
-
Hola disculpen por revivir el post. Quiero modificar el código que me paso el amigo Seba. Lo que quiero hacer es que que solo me cree una matriz de 25 numero con 3 columnas
tenes que modiificar los bucles y listo, ahi te lo hizo ssccaann43.
saludos.
-
ssccaann43, va de 10 punto. increíble lo hice así mismo y nunca me funciono pero compare con lo que tengo y igual es pero me genera otra forma no se por que, Gracias a los 2 por responder.
-
Solo realice pocos cambios, aparte inclui el metodo burbuja de Yvan...!
-
SI a este Ejemplo le agrego una colección que contenga todas las creadas segun el bucle agregado For n=0 to 10000 ..
1-Mi pregunta es para manejar gran cantidad de combinaciones más de 100.000 es conveniente Colecciones o matriz ?
2-Y cual sería la mejor forma para ir chequeando que no exista una combinación idéntica generada anteriormente ?
Dim vBingo As New Collection
Private Sub Command1_Click()
Dim vNumero As Integer
Dim vMinimo As Integer, vMaximo As Integer
Dim vCadena As String
Dim vFila As Integer, vColumna As Integer
For n = 0 To 10000 'cantidad de combinaciones
For vFila = 1 To 5 'Filas
vMinimo = IIf(vFila = 1, 1, ((vFila - 1) * 15) + 1)
vMaximo = (vFila * 15)
Dim ret() As Variant
ret = Generar(vMaximo, vMinimo, 5)
For vColumna = 0 To 4 'Columnas
vCadena = vCadena & ret(vColumna) & ","
Next vColumna
vCadena = vCadena & vbNewLine
Next vFila
vBingo.Add vCadena
vCadena = ""
Next n
End Sub
-
Hola Bazooka si las matrices son un poco mas rápidas que las colecciones sobretodo si las podes redimencionar de una, aveces se utilizan colecciones por comodidad, lo que no te recomiendo es cocatenar cadenas (string) eso es lento por asi decirlo, lo mejor seria almacenar los valores en matriz.
de curioso que tiempo aproximado tarda tu rutina en generar los cartones?. segundos?
si tenes tiempo, explícame como se generan los cartones de Bingo, por lo que lei son 90 numeros y en un carton hay 3 filas con 5 numeros cada fila, pero... donde esta el limite, o cantidad de combinaciones posibles, que pasa cuando son bingos grandes donde hay que generar muchos cartones, explícame un poco.