Excel - Generar números aleatorios

 
Vista:
Imágen de perfil de FernandoML
Val: 60
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Generar números aleatorios

Publicado por FernandoML (12 intervenciones) el 28/02/2020 01:58:50
Hola a todos:

Estoy intentando hacer un programa para lo que necesito generar 22 números aleatorios que van del 0 al 21. Tengo un código el cual me fallla y me gustaría si es posible que me recomendeis como modificarlo para que funcione.

El fallo que tengo es el siguiente:
Cuando se genera un número de forma aleatoria y me sale por ejemplo el 17 y posteriormente me sale el 7, me dice que ya existe. Esto genera un bucle sin fin.

Espero me podais ayudar
Muchas gracias a todos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub GenerarAleatorios()
    Dim Aleatorio, LimiteInferior, LimiteSuperior, X As Byte
    Dim CantidadTotal As Integer
    Dim Registro As String
    Dim Matrix() As String
 
    Randomize
 
    LimiteInferior = 1
    LimiteSuperior = 49
    CantidadTotal = 6
 
    While X < CantidadTotal
        Aleatorio = Int((LimiteSuperior - LimiteInferior + 1) * Rnd + LimiteInferior)
        If InStr(1, Registro, Aleatorio) = 0 Then
            Registro = Registro & Aleatorio & ";"
            X = X + 1
        End If
    Wend
 
    Registro = Left(Registro, Len(Registro) - 1)
 
    Matrix() = Split(Registro, ";")
 
    Columns("A:A").EntireColumn.ClearContents
    For X = 0 To UBound(Matrix)
        Cells((X + 1), 1).Value = Matrix(X)
    Next X
 
    Erase Matrix
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 4.908
Oro
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Generar números aleatorios

Publicado por Antoni Masana (2464 intervenciones) el 28/02/2020 14:08:45
He realizado unos pequeños cambios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub GenerarAleatorios()
    Dim Aleatorio, LimiteInferior, LimiteSuperior, X As Byte
    Dim CantidadTotal As Integer
    Dim Registro As String
    Dim Matrix() As String
 
    Randomize
 
    LimiteInferior = 1
    LimiteSuperior = 49
    CantidadTotal = 6
    Registro = ";"
 
    While X < CantidadTotal
        Aleatorio = Int((LimiteSuperior - LimiteInferior + 1) * Rnd + LimiteInferior)
        If InStr(1, Registro, ";" & Aleatorio & ";") = 0 Then
            Registro = Registro & Aleatorio & ";"
            X = X + 1
        End If
    Wend
 
    Registro = Left(Registro, Len(Registro) - 1)
 
    Matrix() = Split(Registro, ";")
 
    Columns("A:A").EntireColumn.ClearContents
    For X = 1 To UBound(Matrix)
        Cells(X, 1).Value = Matrix(X)
    Next X
 
    Erase Matrix
End Sub

¿Que hace? En primer lugar Registro empieza con un ";" para que al buscar un número lo busque entre 2 punto y coma de esta forma si primero sale el 17 y posteriormente el 7 queda asi el if que pongo cambiando las variables por su contenido:

1
If InStr(1, ";17;" , ";7;") = 0 Then

No hay coincidencia.

Y posteriormente se han de hacer unos cambios en el FOR a la hora de mostrar los resultados.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de FernandoML
Val: 60
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Generar números aleatorios

Publicado por FernandoML (12 intervenciones) el 29/02/2020 19:38:52
Hola Antoni

Muchas gracias por la solución Antoni.

No había caido en eso.

Gracias Master
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de John Jairo
Val: 152
Ha mantenido su posición en Excel (en relación al último mes)
Gráfica de Excel

Generar números aleatorios

Publicado por John Jairo (52 intervenciones) el 28/02/2020 21:39:20
¡Hola, a ambos!

Dejo otra propuesta, usando diccionarios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub GeneraAleatorios()
  Dim Aleatorio&, LimiteInferior&, LimiteSuperior&, CantidadTotal&
  Dim dic As Object
 
  Range("A1").CurrentRegion.ClearContents: Randomize
 
  LimiteInferior = 1: LimiteSuperior = 49: CantidadTotal = 6
  Set dic = CreateObject("scripting.dictionary")
 
  While dic.Count < CantidadTotal
    Aleatorio = Int((LimiteSuperior - LimiteInferior + 1) * Rnd + LimiteInferior)
    dic.Item(Aleatorio) = Aleatorio
  Wend
 
  Range("A1").Resize(CantidadTotal) = Application.Transpose(dic.items())
  Set dic = Nothing
End Sub

¡Bendiciones!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de FernandoML
Val: 60
Ha aumentado 1 puesto en Excel (en relación al último mes)
Gráfica de Excel

Generar números aleatorios

Publicado por FernandoML (12 intervenciones) el 29/02/2020 19:46:49
Hola Jhon

He probado el código y es otra idea que tendré en cuenta. No sabía lo de los diccionarios así que muchas gracias por mostrarmelo.

Gracias tambien por la ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar