Autor
|
Tema: Mis malas combinaciones :( (Leído 22,174 veces)
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.817
|
asumo que el programa lee que son números desde el 01 al 30 correlativamente ? Tu input, del 1 al 30: input 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Mi input, del 1 al 30: Enumerable.Range(1I, 30I).ToArray ' 1 to 30
Recuerda que el código que te he ofrecido solo es un algoritmo que mimica los pasos que has explicado en tu ejemplo, es decir: 30 combinaciones del 1 al 30, dando saltos de 3 posiciones, los combos de 10 numeros de longitud cada combo, y con numeros aleatorios dentro de un rango específico en los espacios libres a rellenar.
no es la idea ¿Que te impide modificar manualmente el array?: ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}
El código actuará (o debería actuar) de la misma manera.
donde muestro los resultados estoy poniendo esto pero solo me sale " colección " Es que le estás intentando pasar una colección que tiene más colecciones dentro, es decir, una Lista de Listas ( List(Of List(Of Integer))), debes pasarle solo las colecciones del interior, las sub-listas de la lista ( List(Of Integer)) y tienes que pasarselas como String. Puedes hacerlo por ejemplo de una de estas dos maneras: 1. Combos.ForEach(Sub(comb As List(Of Integer)) ListBox1.Items.Add(String.Join(", ", comb)) End Sub)
2. ListBox1.Items.AddRange( (From comb As List(Of Integer) In Combos Select String.Join(", ", comb)).ToArray )
De todas formas habia un fallo con la colección Combos (al utilizar el método Combo.Clear se limpiaba también la referencia del Combo que habia dentro de Combos, por ende al final Combos resultaba ser una colección de listas vacías) así que te dejo esta nueva versión corregida y con el ejemplo del Listbox: Public Class LuisClass_v2 ReadOnly Randomizer As New Random ReadOnly FixedValues As Integer() = Enumerable.Range(1I, 30I).ToArray ' 1 to 30 ReadOnly RandomValues As Integer() = Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30 Dim Combo As List(Of Integer) = Nothing Dim Combos As New List(Of List(Of Integer)) Private Sub Test() Handles MyBase.Shown Dim IndexCounter As Integer = FixedValues.First ' 1 Dim LenCounter As Integer = 0I Const NumStep As Integer = 3I Const NumLen As Integer = 10I Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30 Combo = New List(Of Integer) For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3 Combo.Add(Num) LenCounter += 1I If LenCounter >= NumLen Then Exit For End If Next ' Num If LenCounter < NumLen Then ' If LenCounter < 10 For RandomNum As Integer = 1I To (NumLen - LenCounter) Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last) Do Until Not Combo.Contains(n) n = Randomizer.Next(RandomValues.First, RandomValues.Last) Loop Combo.Add(n) Next ' RandomNum End If ' LenCounter < NumLen Debug. WriteLine(String. Join(", ", Combo )) ' Stop #End If Combos.Add(Combo) IndexCounter += 1I LenCounter = 0I Loop ' IndexCounter >= FixedValues.Last ' ******** ' Listbox: ' ******** Combos.ForEach(Sub(comb As List(Of Integer)) ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox. ListBox1.Items.Add(String.Join(", ", From value As String In comb Select If(value.Length = 1I, value.Insert(0I, "0"c), value))) End Sub) End Sub ' Test End Class
|
|
« Última modificación: 19 Agosto 2014, 02:39 am por Eleкtro »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Mil gracias de nuevo ahora si pude hacerlo funcionar Bien aca donde me pones esto , es lo debería de cambiar por mi variable " result " que es la que tiene los números después de efectuada la operación que hago en mi programa ? ya que mi idea es implementarlo a mi programa ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}
por lo demas funciona como queria lo de ordenar de menor a mayor ya me ocupo gracias muchas gracias Luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.817
|
Mil gracias de nuevo ahora si pude hacerlo funcionar Bien aca donde me pones esto , es lo debería de cambiar por mi variable " result " que es la que tiene los números después de efectuada la operación que hago en mi programa ? ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 99, etc...}
¿A cual de las miles de variables que bautizaste con el nombre de "Result" te refieres? Supongo que si, en la variable FixedValues debes especificarle los numeros que se tomarán para hacer las combinaciones, en tu ejemplo pusiste del 1 al 30, no se si harás eso con la variable "result" que mencionas, pero creo que ya te hiciste una idea de lo que debe ir en esa variable FixedValues (valores fijos). por lo demas funciona como queria Me alegro de oir esoPD: Por si acaso te recuerdo que para ordenar de mayor a menor lo tienes facil usando una LINQ-query: dim values as integer() = (from n as integer in TUSNUMEROS order by n ascending).toarray
o el método Sort, en una lista. Saludos!
|
|
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Hola porque no me salen los números que he puesto para combinar ? he echo algunos arreglos para combinar con cinco ya que según la cantidad de números en la variable si me paso se queda en un loop esto lo detecta,pero los números que pongo en ella no ? Public Class LuisClass_v2 ReadOnly Randomizer As New Random ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 9, 20, 25} ReadOnly RandomValues As Integer() = Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30 Dim Combo As List(Of Integer) = Nothing Dim Combos As New List(Of List(Of Integer)) Private Sub Test() Handles MyBase.Shown Dim IndexCounter As Integer = FixedValues.First ' 1 Dim LenCounter As Integer = 0I Const NumStep As Integer = 3I Const NumLen As Integer = 5I Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30 Combo = New List(Of Integer) For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3 Combo.Add(Num) LenCounter += 1I If LenCounter >= NumLen Then Exit For End If Next ' Num If LenCounter < NumLen Then ' If LenCounter < 10 For RandomNum As Integer = 1I To (NumLen - LenCounter) Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last) Do Until Not Combo.Contains(n) n = Randomizer.Next(RandomValues.First, RandomValues.Last) Loop Combo.Add(n) Next ' RandomNum End If ' LenCounter < NumLen Debug. WriteLine(String. Join(", ", Combo )) ' Stop #End If Combos.Add(Combo) IndexCounter += 1I LenCounter = 0I Loop ' IndexCounter >= FixedValues.Last ' ******** ' Listbox: ' ******** Combos.ForEach(Sub(comb As List(Of Integer)) ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox. ListBox1.Items.Add(String.Join(", ", From value As String In comb Select If(value.Length = 1I, value.Insert(0I, "0"c), value))) End Sub) End Sub ' Test End Class
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.817
|
porque no me salen los números que he puesto para combinar ? Por esto: For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3 Combo.Add(Num) ...
Estás tomando el número de la variable num en lugar de tomar un item de la colección FixedValues, se puede decir que esto ha sido un fallo mio porque como ya sabes en ese ejemplo usé una secuencia ordenada del 1 al 30, así que se me pasó por alto ese detalle al desordenar la secuencia xD. Prueba a ver si este es el resultado que quieres obtener: Combo.Add(FixedValues(NumStep * LenCounter)) Edito: o lo que viene a ser lo mismo:Combo.Add(FixedValues(Num - 1))
Explico: Para generar la primera combinación con los números que has mostrado, daría saltos de '3' para tomar estas posiciones: { 1, , , 22, , , 66, , , 20, } + un número aleatorio aleatorio del rango que especificaste EDITO: del rango de 'RandomValues', para dejarlo claro. Saludos
|
|
« Última modificación: 25 Agosto 2014, 20:09 pm por Eleкtro »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Hola Bueno tengo algunos dias tratando de hacer lo que me pusiste elektro pero no me sale o me da combianciones raras o me da el error de variable fuera de rango te pongo el codigo a ver donde me estoy pelando Public Class LuisClass_v2 ReadOnly Randomizer As New Random ' Num ReadOnly FixedValues As Integer() = ' Num Enumerable.Range(1I, 49I).ToArray ' 1 to 30 ReadOnly FixedValues As Integer() = {1, 5, 19, 22, 34, 55, 66, 88, 9, 20, 25} ReadOnly RandomValues As Integer() = Enumerable.Range(FixedValues.First, FixedValues.Last).ToArray ' 1 to 30 Dim Combo As List(Of Integer) = Nothing Dim Combos As New List(Of List(Of Integer)) Private Sub Test() Handles MyBase.Shown Dim IndexCounter As Integer = FixedValues.First ' 1 Dim LenCounter As Integer = 0I Const NumStep As Integer = 3I Const NumLen As Integer = 6I Do Until IndexCounter > FixedValues.Last ' IndexCounter > 30 Combo = New List(Of Integer) For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep ' 1 to 30 Step 3 ' Combo.Add(Num) ' LenCounter += 1I Combo.Add(FixedValues(NumStep * LenCounter)) If LenCounter >= NumLen Then Exit For End If Next ' Num If LenCounter < NumLen Then ' If LenCounter < 10 For RandomNum As Integer = 1I To (NumLen - LenCounter) Dim n As Integer = Randomizer.Next(RandomValues.First, RandomValues.Last) Do Until Not Combo.Contains(n) n = Randomizer.Next(RandomValues.First, RandomValues.Last) Loop Combo.Add(n) Next ' RandomNum End If ' LenCounter < NumLen Debug. WriteLine(String. Join(", ", Combo )) ' Stop #End If Combos.Add(Combo) IndexCounter += 1I LenCounter = 0I Loop ' IndexCounter >= FixedValues.Last ' ******** ' Listbox: ' ******** Combos.ForEach(Sub(comb As List(Of Integer)) ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox. ListBox1.Items.Add(String.Join(", ", From value As String In comb Select If(value.Length = 1I, value.Insert(0I, "0"c), value))) End Sub) End Sub ' Test End Class
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.817
|
For Num As Integer = IndexCounter To (FixedValues.Count) Step NumStep LenCounter += 1I Combo.Add(FixedValues(Num - 1I)) If LenCounter >= NumLen Then Exit For End If Next Num
PD: no se si ese será el resultado que quieres obtener, pero esa es la correción para que funcione el código. saludos!
|
|
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Ahora si ya me toma los numeros y los combina ya estoy con lo del ordenamiento de menor a mayor pero me da este error que un valor de sistems no se puede convertir a string ' ******** ordenamiento------------- Dim values As Integer() = (From n As Integer In Combos Order By n Ascending).ToArray ' ******** ' Listbox: ' ******** Combos.ForEach(Sub(comb As List(Of Integer)) ' Convierto la Lista a 'String', le añado los ceros, y añado el string formateado al Listbox. ListBox1.Items.Add(String.Join(", ", From value As String In comb Select If(value.Length = 1I, value.Insert(0I, "0"c), value))) End Sub) End Sub ' Test
saludos Luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.817
|
¿ Que habiamos hablado sobre dar detalles específicos del error?. De decir esto: me da este error que un valor de sistems no se puede convertir a string A esto: Value of type 'System.Collections.Generic.List(Of Integer)' cannot be converted to 'String'. ...hay todo un trecho. y ya si indicases que instrucción es la que te da error, mejor aún.
Si has modificado la declaración de Combos entonces muestrala ( Dim Combos As...) El código me funciona, ¿quizás tengas activado Option Strict On? Prueba así: ListBox1.Items.Add(String.Join(", ", From value As Integer In comb Select If(CStr(value).Length = 1I, CStr(value).Insert(0I, "0"), CStr(value))))
Saludos!
|
|
« Última modificación: 26 Agosto 2014, 10:38 am por Eleкtro »
|
En línea
|
|
|
|
luis456
Desconectado
Mensajes: 548
|
Hola Bien sigo probando no he modificado nada del codigo solo añadi la rutina que me pusiste arriba y esta es la que me da " Error 1 Un valor de tipo 'System.Collections.Generic.List(Of Integer)' no se puede convertir en 'Integer'. " Dim values As Integer() = (From n As Integer In Combos Order By n Ascending).ToArray
lo que busco es ordenar las combinaciones que se muestran en el listbox ordenados de menor a mayor luis
|
|
|
En línea
|
Que tu sabiduria no sea motivo de Humillacion para los demas
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Instrucciones malas :P
Ingeniería Inversa
|
x64core
|
3
|
2,907
|
7 Diciembre 2011, 16:45 pm
por Flamer
|
|
|
Combinaciones con subrangos
.NET (C#, VB.NET, ASP)
|
luis456
|
1
|
1,683
|
25 Noviembre 2014, 12:20 pm
por Eleкtro
|
|
|
Usuarios de Yelp bombardean pizzería antigay con malas reseñas
« 1 2 3 4 5 »
Noticias
|
wolfbcn
|
47
|
11,082
|
5 Abril 2015, 03:10 am
por MinusFour
|
|
|
Mas combinaciones condicionadas
.NET (C#, VB.NET, ASP)
|
luis456
|
0
|
1,330
|
5 Abril 2016, 11:42 am
por luis456
|
|
|
Vulnerabilidades por malas practicas streaming
Bugs y Exploits
|
neftali.evando88
|
5
|
7,177
|
23 Octubre 2020, 20:44 pm
por MCKSys Argentina
|
|