Rellenar con rand no me funciona

Iniciado por luis456, 29 Marzo 2015, 12:20 PM

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

luis456

Otra de las mias
cuando quiero unir dos rutinas o mas no me funciona lo de rellenar con numeros aleatorios dentro del rango

se supone que este codigo al no haber mas numeros dentro del arreglo tomaria uno al azar dentro del rango establecido pero no se que pasa ahora que no lo hace


Código (vbnet) [Seleccionar]
  ReadOnly MAX As Integer = 99


       Dim Rand As New Random
       Dim ReAsult2255e As IEnumerable(Of Integer) =
          (splits(1).Concat(splits(3).Concat(splits(5).
          Distinct.
          Select(Function(Value As Integer)
                     Return If(Value < MAX, Value, Rand.Next(1, MAX))
                 End Function))))

       Dim seAlecctedValues231 As IEnumerable(Of Integer) = ReAsult2255e
       Dim liste3 As List(Of Integer) = ReAsult2255e.Take(10).ToList
       liste3.Sort()
       ListBox12.Items.AddRange(liste3.Cast(Of Object).ToArray)
       ' ----------------------------------------------------------------------
     

      Dim Rand1 As New Random
       Dim AReAAsult2255e As IEnumerable(Of Integer) =
          (splits(3).Concat(splits(10).Concat(splits(11).Concat(splits(12).
          Distinct.
          Select(Function(Value As Integer)
                     Return If(Value < MAX, Value, Rand1.Next(1, MAX))
                 End Function)))))

       Dim seAlecctedValues231A As IEnumerable(Of Integer) = AReAAsult2255e
       Dim listeA3 As List(Of Integer) = AReAAsult2255e.Take(10).ToList

       listeA3.Sort()
       ListBox13.Items.AddRange(listeA3.Cast(Of Object).ToArray)



Luis


Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#1
No te funciona cómo esperas porque, en los dos casos que has mostrado, estás aplicando el Distinct y el Select solamente a la última concatenación, puesto que tienes las agrupaciones del Concat abiertas:

Citar
Código (vbnet,1,5) [Seleccionar]
(splits(3).Concat(splits(10).Concat(splits(11).Concat(splits(12).
Distinct.
Select(Function(Value As Integer)
      Return If(Value < MAX, Value, Rand1.Next(1, MAX))
End Function)))))

Para solucionarlo, simplemente fíjate mejor en las concatenaciones que haces en 'ReAsult2255e' y 'AReAAsult2255e', cierra las agrupaciones de ambos correctamente:

Código (vbnet,1,5) [Seleccionar]
(splits(3).Concat(splits(10)).Concat(splits(11)).Concat(splits(12))).
Distinct.
Select(Function(value As Integer)
      Return If(Value < MAX, Value, Rand1.Next(1, MAX))
End Function)


Se que no te gusta oir esto, pero es que no tendrías ese tipo de problemas si ordenases y estructurases mejor tú código, es un completo lio lo que tienes ...y lo sabes.

En mi opinión, lo mejor para ti es que fueses haciendo las cosas por partes, poco a poco, cómo en este ejemplo de abajo donde construyo la colección paso a paso,
haciendolo de esta manera te ayudarías a ti mismo a debuguear el código mejor, al poder recurrir/conocer facilmente el estado de la colección antes de hacerle una modificación (cómo la del Select) para hacerle cambios con menos esfuerzo, y también reducir los errores que tienes de mal agrupamiento, o etc:

Código (vbnet) [Seleccionar]
Dim concatCol As IEnumerable(Of Integer) = col1.Concat(col2)
Dim distinctCol As IEnumerable(Of Integer) = concatCol.Distinct
Dim selectCol As IEnumerable(Of Integer) = distinctCol.Select(Function(value As Integer)
                                                                 If value < max Then
                                                                     Return value
                                                                 Else
                                                                     Return rand.Next(1, max)
                                                                 End If
                                                             End Function)


Saludos








luis456

Se que no te gusta oir esto, pero es que no tendrías ese tipo de problemas si ordenases y estructurases mejor tú código, es un completo lio lo que tienes ...y lo sabes.

Claro que si lo se, pero tengo una grave problema y es siempre la " P " prisa de ver cono funciona y siempre digo " despues lo ordeno "  y asi vamos  :(  tengo que tratar de ser mas ordenado y valla tambien para los que estan aprendiendo a Programar es un sano consejo que nos da Elektro y se agradece :)

Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Sigo teniendo problemas con esto pense que lo podria resolver yo pero na :(

he probado a cambiar las declaraciones del rango max de estas formas pero no me me va y cuando algo hizo solo relleno con ceros ???

la funcion que uso no calcula una cantidad fija de numeros y dependiendo de eso, a veces va bien pero creo cuando se queda corto de cantidad de numeros me sale este error en tiempo de ejecucion

El valor no puede ser nulo.
Nombre del parámetro: second





Código (vbnet) [Seleccionar]
ReadOnly MAX As Integer = 99  ( de cualquiera de las formas no hace nada )
Dim MAX As Integer = 99



Código (vbnet) [Seleccionar]
  Dim concatCol5 As IEnumerable(Of Integer) = splits(3).Concat(splits(13).Concat(splits(15)))
        Dim distinctCol5 As IEnumerable(Of Integer) = concatCol5.Distinct
        Dim selectCol5 As IEnumerable(Of Integer) = distinctCol5.Select(Function(value As Integer)
                                                                            If value < MAX Then
                                                                                Return value
                                                                            Else
                                                                                Return Rand.Next(1, MAX)
                                                                            End If

                                                                        End Function)



        ListBox9.Items.AddRange(selectCol5.Cast(Of Object).ToArray)




Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

Eleкtro

#4
Cita de: luis456 en 30 Marzo 2015, 18:42 PMEl valor no puede ser nulo.
Nombre del parámetro: second

El error es self-explanatory, se explica por si mismo, date cuenta, la segunda secuencia que estás intentando concatenar a la primera secuencia es una referencia nula (es decir, no se le ha asignado ningún valor, la colección no existe), puede ser una de las que he marcado en rojo:

Dim concatCol5 As IEnumerable(Of Integer) = splits(3).Concat(splits(13).Concat(splits(15)))

(y además de eso no has corregido las agrupaciones cómo te dije en el comentario anterior, es decir, los paréntesis, aunque ese no es el motivo del error)

Cómo indica el mensaje de error, para corregirlo solo debes asegurarte de que la colección que le estás pasando al parámetro "second" de la función "concat" no sea una referencia nula.

revisa bien el resto del código, comprueba que splits(13) y splits(15) existan antes de intentar concatenarlos (msgbox( splits(13) is nothing )), no te puedo ayudar a hallar el motivo ya que no forma parte del código que has mostrado.

Este ejemplo que puedes examinar, produce la misma excepción que has comentado, ya que la segunda colección es nula (no confundir con "vacía" {} ):

Código (vbnet) [Seleccionar]
Dim col1 As IEnumerable(Of String) = {}
Dim col2 As IEnumerable(Of String) ' = Nothing

Dim concatCol As IEnumerable(Of String) = Enumerable.Concat(first:=col1, second:=col2)


Saludos








luis456

A ver segun los calculos que me hace el programa sabes, me entrega cierta cantidad de numeros que varian desde ( 00 al 99 ) unas veces 50 o mas numeros otras 40 y ciertas ocasiones muchas menos y es aca cuando se produce el error, ya que como casi siempre estan por los 50 numeros no da problemas de este tipo ,solo cuando baja de esa cantidad y claro salta el error, ya que no hay numeros para llenar a  splits(13)  splits(15) pero mayormente no falla, lo que quiero es ver como suplir esos numeros que faltarian y dentro del rango ?


Luis
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Estudiando el caso este descubri que la forma de que no me de error es mantener el arreglo dentro del minimo de registros que es de 35 registros por debajo de esa cantdad me produce el error, ahora lo que no tengo ni idea como hacerlo,se me ocurre con generar numeros aleaorios dentro el rango pero que no repitan con los de la variable  ;(

luis
Que tu sabiduria no sea motivo de Humillacion para los demas

luis456

Para cerrar eseto , aca esta con lo que lo solucione ;) gracias a nuestro amigo elektro   :silbar:

Código (vbnet) [Seleccionar]
' aca esta para relleñar con ceros-----------
        If Resultss.Count <35 Then
            Resultss = Resultss.Concat(Enumerable.Repeat(Of Integer)(0, (35 - Resultss.Count)))

MsgBox(li.Count) '35
        End If


Luis
Que tu sabiduria no sea motivo de Humillacion para los demas