Jump to content
Guest FernandoML

Numeros aleatorios

Recommended Posts

Guest FernandoML

Hola a tod@s:

Estoy realizando un programa y tengo el siguiente problema.

Necesito crear un array de 22 elementos que van del 0 al 21. Y necesito rellenarlos tambien del 0 al 21 de forma aleatorio y que no se repitan.

 

podeis decirme como hacerlo

Gracias y un saludo

Edited by FernandoML

Share this post


Link to post
Share on other sites

para generar numeros aleatorios hay diferentes metodos desde los mas simples a los mas complejos, usando el promedio y la desviacion o probabilidades como en la simulacion de montecarlo, en el archivo anexo veras una muestra de lo que quieres usando la funcion de Excel aleatorio.entre que junto con un contenedor de memoria filtraran los repetidos dejandote solo unumeros unicos

numeros aleatorios.xlsm

Share this post


Link to post
Share on other sites

Mi Sample con Diccionario:

Sub NumAleatorios_LBV()
Dim miDiccionario As Object, rep&, xValor, i&, K, aArray(22)
    Set miDiccionario = CreateObject("Scripting.Dictionary")
    For i = 1 To 22
Repite:
        xValor = WorksheetFunction.RandBetween(0, 21)
        If miDiccionario.Exists(xValor) = False Then
            miDiccionario.Add xValor, rep
            aArray(i) = xValor
        Else
            GoTo Repite
        End If
    Next i
    i = 2
    For Each K In aArray
        Cells(i, 3).Value = K
        i = i + 1
    Next K
    Set miDiccionario = Nothing
End Sub

Saludos.

Share this post


Link to post
Share on other sites

Hola @FernandoML

Te brindo mi aportación:

Sub GenerarAleatorios()
Dim aleatorios As Variant
Range("B1:B22") = [ROW(B1:B22)-1]
Range("A1:A22").Formula = "=RAND()"
Range("A1").CurrentRegion.Sort Range("A1"), xlAscending
aleatorios = Application.Transpose(Range("A1").CurrentRegion.Offset(, 1).Resize(, 1).Value2)
Cells.Clear
End Sub

Saludos!

Share this post


Link to post
Share on other sites
Hace 10 horas, digitalboy dijo:

Hola @FernandoML

Te brindo mi aportación:


Sub GenerarAleatorios()
Dim aleatorios As Variant
Range("B1:B22") = [ROW(B1:B22)-1]
Range("A1:A22").Formula = "=RAND()"
Range("A1").CurrentRegion.Sort Range("A1"), xlAscending
aleatorios = Application.Transpose(Range("A1").CurrentRegion.Offset(, 1).Resize(, 1).Value2)
Cells.Clear
End Sub

Saludos!

Todo el código iba bien hasta que aparece esta linea...

Cells.Clear

 

Saludos.

Share this post


Link to post
Share on other sites
Hace 29 minutos , Leopoldo Blancas dijo:

Todo el código iba bien hasta que aparece esta linea...

Cells.Clear

Saludos.

Esa línea no es obligatoria... Además que en la consulta inicial se específica que se quiere el resultado en un array, no en la hoja de cálculo.

Saludos!

Share this post


Link to post
Share on other sites
Hace 21 minutos , digitalboy dijo:

Esa línea no es obligatoria... Además que en la consulta inicial se específica que se quiere el resultado en un array, no en la hoja de cálculo.

Saludos!

Tienes razón, pensé que se te había olvidado quitar esa linea... Me disculpo.

Saludos.

Share this post


Link to post
Share on other sites
Guest FernandoML

Muchas gracias a todos por las respuestas. Probare alguna de las soluciones que me habeis aportado y os dire como ha ido para cerrar el tema.

 

De nuevo gracias a todos

Share this post


Link to post
Share on other sites
Guest FernandoML

Hola a todos los que me habeis aportado con vuestros conocimientos.

Gracias @Dr Hyde tu ejemplo me ha funcionado correctamente y es justo lo que necesito.

Gracias tambien a @Leopoldo Blancas también me sirvió el código que me enviastes

Gracias tambien a @digitalboy El ejemplo que me enviastes me ha funcionado tambien, lo he retocado para que se adapte a lo que necesitaba.

 

Entre todos los ejemplos al final se ha quedado de esta manera por si os sirve.

Sub AleatoriosNoRepetidos()
    Dim i As Integer
    
    'generamos la coleccion
    Set unicos = New Collection
    
    x = 0   'núm inicial del rango de valores
    y = 21  'núm final del rango de valores
    Z = 22  'numero de elementos no repetidos que queremos
    
    'Inicializamos el generador de números aleatorios
    Randomize
    
    'loop hasta conseguir Z elementos de la Collection (20 elementos)
    Do Until unicos.Count = Z
        'generamos nuevos aleatorios entre x e y (entre 1 y 100)
        ale = Int((y - x + 1) * Rnd + x)
        'cuando encuentre un item repetido, daría un error
        'que salvamos con la instrucción On Error Resume Next
        On Error Resume Next
        'por tanto, nuestra coleccion solo agrega elementos no repetidos
        'objeto.Add item, key, before, after
        'ocurre un error si una key especificada duplica la key de un miembro existente de la colección
        unicos.Add ale, CStr(ale)
        On Error GoTo 0
    Loop
    
    'escribir los datos unicos en la Hoja de cálculo
    For i = 1 To unicos.Count
        Sheets("Macro").Range("B2").Offset(i - 1, 0).Value = unicos(i)
    Next i

End Sub

Esta solución la encontré en:

https://excelforo.blogspot.com/2012/09/aleatorios-sin-repeticion-con-macros-en.html

Muchas gracias y un saludo a todos

Edited by FernandoML

Share this post


Link to post
Share on other sites
Hace 9 minutos , FernandoML dijo:

Esta solución la encontré en:

https://excelforo.blogspot.com/2012/09/aleatorios-sin-repeticion-con-macros-en.html

Muchas gracias y un saludo a todos

Como... Al Final se quedo con otra solución diferente, que encontró en otro lugar? jajaja

Share this post


Link to post
Share on other sites

una ciclo do while es muy lento comparado con un ciclo For i, next, ademas es mucho mas rapido agregar los datos a la hoja a traves de una matriz todos a la vez en vez de 1 por uno como lo muestras, todas las soluciones planteadas aqui son mas eficientes que como  lo planteas, en fin es la solucion que elegiste personalmente no la usaria y vaya que tengo años trabajando con sistemas de numeros aleatorios.

Share this post


Link to post
Share on other sites
Guest FernandoML

Hola a todos:

Mientras esperaba respuestas, intente buscar la solucion por otro sitio (Igual que hace mucha gente). Pense que aportando lo que encontré ayudaría a alguien. Pero al parecer ha molestado.

Si ha molestado, lo siento.

Share this post


Link to post
Share on other sites

Hola Fernando

Hace 1 hora, FernandoML dijo:

Hola a todos:

Mientras esperaba respuestas, intente buscar la solucion por otro sitio (Igual que hace mucha gente). Pense que aportando lo que encontré ayudaría a alguien. Pero al parecer ha molestado.

Si ha molestado, lo siento.

Tranquilo, no pasa nada, lo que sucede es que cuando se menciona "array", nosotros entendemos varias cosas

Lo importante es que no esperaste solo la respuesta, eso es valioso, en el aprendizaje

Te adjunto mi versión para la colección, similar pero no igual al de Leopoldo, utilizando el objeto "Dictionary"

 

Saludos!

Aleatorios utilizando objeto dictionary_GP.zip

Share this post


Link to post
Share on other sites
Guest FernandoML

Gracias Gerson por la respuesta, ya lo he probado y me funciona de maravilla.

Muchas gracias por todo

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy

Ayuda Excel - Madrid, Madrid, ES - Valorada por 5112 personas - Aprender Excel - Total: 4.7 / 5