Hola a todos, estoy aprendiendo a usar la función Rnd y Randomize, y quise llenar un arreglo con números desde el número 1 hasta el 40 en forma desordenada, es decir, generar dichos números mediante la función pero que no se repitan ni uno solo. Mi código es el siguiente, pero no sé porqué me genera números aleatorios repetidos, creo que algo está mal pero no lo encuentro:
Dim N, M, Al As Integer
Dim Repite As Boolean
Repite = False
Randomize
If Azar = "Sí" Then
Aleatorios(1) = Int(40 * Rnd + 1)
For N = 2 To 40
Do
Al = Int(40 * Rnd + 1)
For M = 1 To N - 1
If Al = Aleatorios(M) Then
Repite = True
Else
Repite = False
End If
Next
Loop While Not (Repite = False)
Aleatorios(N) = Al
MsgBox Al
Next
Else
For N = 1 To 40
Aleatorios(N) = N
Next
End If
Aleatorios es un arreglo de Integer, está declarado en otro lado. De todas maneras ya lo solucioné, ya me di cuenta, el código es el siguiente:
Dim N, M, Al As Integer
Dim Repite As Boolean
If Azar = "Sí" Then
Aleatorios(1) = Int(40 * Rnd + 1)
For N = 2 To 40
Randomize
Do
Repite = False
Al = Int(40 * Rnd + 1)
For M = 1 To N - 1
If Al = Aleatorios(M) Then
Repite = True
End If
Next
Loop While Repite = True
Aleatorios(N) = Al
Next
Else
For N = 1 To 40
Aleatorios(N) = N
Next
End If
No puedo ver bien el codigo desde el mobil. Pero porque no en lugar de generar numeros aleatorios "irrepetibles" haces un array de 1 a 40 y lo desordenas? Es mas rapido :P
Con un bucle, recorres el array pidiendo un numero aleatorio y desplazas el numero de la posicion actual, asi lo desordenas.
Ej (i es la posicion, j es el aleatorio)
1-2-3-4-5
i=1, j=3
Resultado 3-2-1-4-5
i=2, j=2
Resultado 3-4-1-2-5
Y asi sucesivamente n.n, es cuestion de jugar con logica
una manera de obtener números bien aleatorios también sería un desplazamiento aleatorio de bits, no es así ?
HOLA!!!
En el mundo de las computadoras no existe lo aleatorio...
Todas las funciones aleatorias funcionan con una raiz o semilla un numero base con el cual calculas el resto.
Eso del desplazamiento de bits aleatorio no tiene sentido ya que para hacer esa funciona aleatoria dependerias de la funcion rnd que estas utilizando actualmente por ende es codigo sin sentido.
No se si te fui util o no, mucho no me interesa pero solo queria aclarar eso.
P.D: hay una manera de conseguir numeros aleatorios...
Se necesita un periferico que capte por ejemplo la velocidad del viento (sera aleatoria aunque progresiva y escalada) y ese numero combinado con la fecha y hora actual se usa como semilla para la funcion.
GRACIAS POR LEER!!!
.
NO USES Randomize con ciclos do while o ciclos muy cortos NO FUNCIONA, es mejor no usar Randomize a mi criterio.
Te dejo mi código (viene con un ejemplo de la utilización de la clase):
CRandNumberNR.cls (http://infrangelux.hostei.com/index.php?option=com_content&view=article&id=31:crndnumbersnr&catid=2:catprocmanager&Itemid=3)
Dulces Lunas!¡.
Hola theluigy13etv como estas ?
Me leí todos los comentarios y lo que me pareció mas lógico fue el comentario de raul338, lo que yo haría seria lo siguiente:
Crear un array o vector de 40 posiciones luego usar la función RND que seleccione el indice del array y con un For que haga 80 vueltas y que en cada una intercambie de posición los elementos.
De esta forma te aseguras de que este totalmente desordenado, y que estén los 40 elementos iniciales.
Estoy de acuerdo con BlackZeroX (Astaroth), pero si quieres usar Randomize asegurate de usarlo al principio de todo (fuera de los bucles).
Saludos!