Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 2 de 2
Ir a la página Anterior  1, 2
 
No Repetir Un Numero Aleatorio Con Rnd
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
repite numeros por que un numero aleatorio como es aleatorio se puede repetir
para que no repita numeros  hay varias maneras


pero en el codigo que muestras   hay varias maneras la mas simple creo es

provaria colocando el  el array en publico

pd vas bien pero te falta estudiar el ambito
 



 
codificador - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Codificador tiene razón.

La rutina es esta
FUNCTION calcularAleatorio() AS Integer

DIM numeros AS NEW integer[], x AS Integer, aleatorio AS Integer
RANDOMIZE
FOR x = 1 TO 12
DO WHILE TRUE 'sale de este bucle cuando tiene un número que no está en la lista de números
  aleatorio = Int(Rnd(1, 13))
  IF numeros.find(aleatorio) = -1 THEN 'si el número obtenido no está en la lista
     numeros.add(aleatorio) 'añadir el número a la lista
    
     BREAK
  ENDIF
LOOP
RETURN aleatorio
NEXT
END

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

FUNCTION calcularAleatorio() AS Integer

DIM x AS Integer, aleatorio AS Integer
RANDOMIZE
FOR x = 1 TO 12
DO WHILE TRUE 'sale de este bucle cuando tiene un número que no está en la lista de números
  aleatorio = Int(Rnd(1, 13))
  IF numeros.find(aleatorio) = -1 THEN 'si el número obtenido no está en la lista
     numeros.add(aleatorio) 'añadir el número a la lista
    
     BREAK
  ENDIF
LOOP
RETURN aleatorio
NEXT
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

private $Numeros as new integer[]
Property Mas as integer
private $Mas as integer
property Min as integer
private $Min as integer

PUBLIC FUNCTION calcularAleatorio() AS Integer

DIM x AS Integer, aleatorio AS Integer
RANDOMIZE

DO WHILE TRUE 'sale de este bucle cuando tiene un número que no está en la lista de números
  aleatorio = Int(Rnd($Min, $Max))
  IF $numeros.find(aleatorio) = -1 THEN 'si el número obtenido no está en la lista
     $numeros.add(aleatorio) 'añadir el número a la lista    
     BREAK
  ENDIF
LOOP
RETURN aleatorio

END

'esto ya te lo pone gambas. tu solo rellenas lo que deben hacer las funciones y te lo pongo en subrayado
private function Min_read() as integer
[u]return $Min[/u]
end
private function Min_write(value as integer)
[u]$Min=value[/u]
end
private function Max_read() as integer
[u]return $Max[/u]
end
private function Max_write(value as integer)
[u]$Max=value[/u]
end

 

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
property CantNumeros as integer
private $CantNumeros as integer

private function CantNumeros() as integer
return $Cantnumeros
end
private sub CantNumeros_Write(value as integer)
$CantNumeros0value
end
 
También necesitas una propiedad de solo lectura donde te devuelvan la colección de números aleatorios obtenidos
property read NumListaAleatorios as integer[]
private $NumListaAleatorios as new integer[]

private function NumListaAleatorios() as integer[]
return $NumListaAleatorios
end
 

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
public sub ObtenerListaAleatorios()
dim Contador as integer
for contador=0 to $CantNumeros
   $NumListaAleatorios.add(ObtenerAleatorio())
next
end
 

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
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Una respuesta tarde
 



 
última edición por ivanovichenco el Martes, 18 Enero 2011, 03:10; editado 2 veces 
ivanovichenco - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Evitar Repetir Letras Dani26 Aplicaciones/Fragmentos de Código 1 Sabado, 19 Junio 2010, 11:26 Ver último mensaje
Emmet
No hay nuevos mensajes Problema Aleatorio En El Editor De Gambas3 Shell General 6 Martes, 03 Julio 2012, 23:19 Ver último mensaje
Shell
No hay nuevos mensajes Número Aleatorio didier18 Aplicaciones/Fragmentos de Código 9 Martes, 18 Octobre 2016, 22:53 Ver último mensaje
vuott
No hay nuevos mensajes Repetir Un Caracter N Veces tincho Aplicaciones/Fragmentos de Código 2 Domingo, 11 Diciembre 2016, 13:06 Ver último mensaje
tincho
 

Publicar nuevo tema  Responder al tema  Página 2 de 2
Ir a la página Anterior  1, 2

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron