Re: No Repetir Un Numero Aleatorio Con Rnd
Codificador tiene razón.
La rutina es esta
Como ves cada vez que entras en la rutina se crea la colección Numeros que incluye todos los números que vas obteniendo. Cuando sales se borra y cuando vuelves a entrar se vuelve a crear. Con eso cada vez que llamas a la función no considera los anteriores.
Una forma de resolverlo sencilla es declarar Numeros as integer[] en un ámbito superior o pasárselo como parámetro.
private Numeros as new integer[]
...
...
imagen.picture = Picture[Application.Path & "/" & calcularAleatorio() & ".JPG"
...
end
Ahora la colección Numeros no se crea ni se destruye en la función. Se crea fuera y está en un ámbito que será conocida dentro de la función. Como la declaré a nivel de clase será conocida en todo su form/modulo/clase. Eso es lo que te decía codificador. La variable existe en un ámbito concreto. Si te sales de ese ámbito la variable se destruye y cuando vuelves a entrar se vuelve a crear a cero. Por tanto si buscas números que metiste antes ya no están.
------------------------------------
Ahora algo importante pero que no tiene que ver directamente con eso
------------------------------------
Ya puestos a decir yo haría la función para un caso mas general y así si un día vuelves a trabajar con números aleatorios te valga en cualquir caso. Reutilización de código
Yo haría una clase a la que llamaria AleatorioCls que tendría eto
Tal como está la función ObtenerAleatorio te devuelve números entre Min y Max no repetidos. Si lo que quieres es que también te pueda devolver una lista de números en vez de dártelos de uno en uno necesitas otra propiedad para indicarle cuantos números quieres conseguir
También necesitas una propiedad de solo lectura donde te devuelvan la colección de números aleatorios obtenidos
Y por último necesitas una función que haga eso. Esa función llama a ObteneAleatorio y cada número que obtiene lo mete en la colección $NumAleatorios
y el resultado estaría en la propiedad NumListaAleatorios
Y de ahí en adelante, como ya tienes hecha esa clase cada vez que necesites números aleatorios no repetidos haces
DIm H as new AleatorioCls 'crear una clase H que sea de tipo AleatorioCls
H.min=0 'poner la propiedad Min a 0
H.max=900 'poner la propiedad Max a 0
Numero=H.ObtenerAleatorio()
Eso te devolvería en Numero un número aleatorio entre 0 y 900 no repetido mientras exista H.
Si lo que quiero en vez de un número es una lista de numeros
DIm H as new AleatorioCls 'crear una clase H que sea de tipo AleatorioCls
dim MiLista as new integer[] 'donde quedará la lista de numeos
H.min=0 'poner la propiedad Min a 0
H.max=900 'poner la propiedad Max a 0
H.CantNumeros=100 'obtener 100 numeros aleatorios entre 0 y 900 sin repetición
MiLista=H.ObtenerListaNumeros()
Te lo he puesto así para que entiendas las ventajas que te dan las propiedades y clases. De esa forma consigues código mucho mejor, mas estructurado y lo puedes reutilizar en cualquier parte para lo que necesites. Quizá algún día necesites algo nuevo respecto a los aleatorios. Pues añades a esa clase otra función que lo haga y ya está para siempre. Basta con agregar la clase AleatorioCls a tu proyecto.
Aplica eso a manejo de ficheros, bases de datos, formularios, dispositivos, ..., etc.
Un saludo