Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
No Repetir Un Numero Aleatorio Con Rnd
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje No Repetir Un Numero Aleatorio Con Rnd 
 
Hola a todos.

Como puedo generar números aleatorios sin que se repitan?

por ejemplo:

aleatorio = Int(Rnd(1, 13))


si el programa pasa por esa linea 13 veces, que no se repita el numero generado con Rnd.
 



 
pittusa - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Mira , yo uso este código  para evitar repetir letras.
Código: [Descargar] [Mostrar]

' gambas class file

PUBLIC SUB Button1_Click()

' ---------------buscar si la letra ya fue usada, si no es asì, instr devuelve un cero
 IF InStr((TextBox2.text), (TextBox1.text)) > 0 THEN
 Message.Info("elige otra letra")
 ELSE
'-----------------------agregar la letra en el textbox de las usadas
 TextBox2.text = TextBox2.text & TextBox1.text
  ENDIF
 
END

 Creo que con un poco de ingenio lo puedes adaptar a tus nececidades, creando una segunda variable prealeatoria que verifique que el número no haya salido y lo asigne a la variable aleatorio, si esta repetido que vuelve a ejecutar el Rnd.
Debes ir guardando los números ya salidos en un textbox, por ejemplo.
Espero te sirva.
Saludos
 




===================
Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
 
Dani26 - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Hola.

Gracias. me diste una idea y se me ocurrió esto:

REPEAT
   aleatorio = Int(Rnd(1, 13))
   UNTIL aleatorio <> repetido 'repetido es la variable donde guardo el ultimo numero dado por rnd


Pero no funciona algunos números se repiten.

ese código esta dentro de un for next que se ejecuta 12 veces y va rellenando unos picturebox
con las imágenes de un puzle.

El puzle se compone de 12 picturebox creados por código, y las imágenes están numeradas del 1 al 12.(1.jpg 2.jpg asta 12)

deben estar desordenadas para que el usuario las ordene.

pongo todo el código:
PUBLIC SUB Form_Open()


  DIM i AS Integer
  DIM x AS Integer
  DIM y AS Integer
  
  x = 10
  y = 500
  
FOR i = 1 TO 12

imagen = NEW Picturebox(ME) AS "fotosale"

imagen.y = y  
imagen.x = x
imagen.Width = 77
imagen.Height = 77

   REPEAT
   aleatorio = Int(Rnd(1, 13))
   UNTIL aleatorio <> repetido
  

   repetido = aleatorio
   imagen.picture = Picture[Application.Path & "/" & aleatorio & ".JPG"]



arrayimagen[i] = imagen
x = x + 75

NEXT


este código genera los picturebox en horizontal con las imágenes desordenas para que el usuario las arrastre a otros picturebox y
las valla ordenando.
 



 
última edición por pittusa el Domingo, 16 Enero 2011, 22:47; editado 2 veces 
pittusa - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Hola

Los números aleatorios se obtienen mediante un proceso que realiza una serie de operaciones. Si repites el mismo proceso con los mismos valores de inicio obtendrás naturalmente los mismos valores. Lo que hay que hacer es cambiar la semilla de inicio de ese proceso para que cada vez los valores sean distintos

Dim x as integer, y as integer
for x=0 to 9
y=rnd(0,7)
print y
next


Esto devuelve diez números aleatorios entre 0 y 7. Siempre los mismos porque siempre parte de la misma semilla para alimentar al proceso que devuelve el número.

Para cambiarlo se utiliza la orden randomize(semilla) aunque si no se especifica la semilla entonces utiliza el tiempo como semilla así que basta con ponerlo

Dim x as integer, y as integer
randomize()
for x=0 to 9
y=int(rnd(0,7))
print y
next


Ahora bien, si lo que quiero es impedir que salga un número que ya salió antes entonces debo guardar los números que salen en un string[]

Dim x as integer, y as integer, numeros as new integer[]
randomize()
for x=0 to 9
do while true 'sale de este bucle cuando tiene un número que no está en la lista de números
   y=int(rnd(0,9))
   if numeros.find(y) then 'si el número obtenido no está en la lista
      numeros.add(y) 'añadir el número a la lista
      break
   endif
loop
print y
next
 


Este bucle devuelve los números del 0 al 9 sin repeticiones
 



 
última edición por soplo el Domingo, 16 Enero 2011, 23:16; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Lo que pasa que solo estás guardando el último número salido, debes guardarlos todos para que no repita ninguno.
Prueba crear dos texbox, invisibles,txtaleatorio y txtrepetido.
   aleatorio = Int(Rnd(1, 13))
txtaleatorio.text= aleatorio
  
UNTIL  InStr((txtaleatorio.text), (txtrepetido.text)) > 0
  imagen.picture = Picture[Application.Path & "/" & aleatorio & ".JPG"]
'-----------------------agregar el número en el textbox de los usados
 txtrepetido.text = txtrepetido.text & txtaleatorio.text
 

Si no me equivoco debería funcionar.
Saludos
 




===================
Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
 
Dani26 - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
¿Yo estoy guardando solo uno?

¡Mira bien!
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Soplo, la respuesta era para pittusa, se ve que mientras yo escribía tú publicabas  a su vez tu respuesta. Además soy consciente que  sabés mucho más que yo y miraría muy bien antes de contradecirte.
Saludos
 




===================
Migrando desde visual basic, el Gambas de Ms
Mi blog gambero
 
Dani26 - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Soplo, se repiten usando el código tuyo, aunque deberia funcionar. Donde esta el error?
Dim x as integer, y as integer, numeros as new integer[]
randomize()
for x=0 to 9
do while true 'sale de este bucle cuando tiene un número que no está en la lista de números
   y=int(rnd(0,9))
   if numeros.find(y) then 'si el número obtenido no está en la lista
      numeros.add(y) 'añadir el número a la lista
      break
   endif
loop
print y
next

3
0
4
2
2
5
5
4
7
0

uso gambas 2.22 ubuntu 10.04

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

Lo de  PRNT X fue que swe me quedo de una prueba que estuve haciendo para imprimirlos en forma de tabla y luego se me olvido arreglrlo
 



 
última edición por ivanovichenco el Martes, 18 Enero 2011, 02:43; editado 6 veces 
ivanovichenco - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
cambia el "if numeros.find(y) then" por "if numeros.find(y)=-1 then"

Es por eso

Bueno y que el número calculado es y no x así que hay que hacer print y y no print x

Contradice cuanto quieras hombre, que es muuuuy complicado enfadarme por cosas así y además yo no estoy libre de errores. Mira que cagada mas tonta acabo de hacer je je je Yo sé mas porque empecé antes no por otra cosa osea que si hay que llevarme la contraria pues se me lleva y ya está

 
 



 
última edición por soplo el Lunes, 17 Enero 2011, 15:56; editado 2 veces 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: No Repetir Un Numero Aleatorio Con Rnd 
 
Hola amigos.

Estoy flipando con las respuestas. De verdad que sois la hostia! a parte de muy buenos.

Haber si ahora os vais a pelear por mi culpa!  jaja    bromas a parte.

La verdad que que estoy un poco liado de como integrar vuestros códigos al mio, pero la base la entiendo.

Bueno... de momento he echo esto: Una función que devuelve el numero aleatorio

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

 


y luego:

imagen.picture = Picture[Application.Path & "/" & calcularAleatorio() & ".JPG"


pero me repite numeros!

que hago mal? lo estoy haciendo bien al hacer una función?

como lo integro.

gracias por todo.
 



 
última edición por pittusa el Lunes, 17 Enero 2011, 19:44; editado 2 veces 
pittusa - 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 1 de 2
Ir a la página 1, 2  Siguiente

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