Foros del Web » Programando para Internet » Python »

Números aleatorios sin repetición

Estas en el tema de Números aleatorios sin repetición en el foro de Python en Foros del Web. Hola, Estoy dando mis primeros pasos en Python y me gustaria poder realizar un programa que generara números aleatorios sin repeticion. Este programa tendria que ...
  #1 (permalink)  
Antiguo 20/12/2009, 09:00
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Números aleatorios sin repetición

Hola,

Estoy dando mis primeros pasos en Python y me gustaria poder realizar un programa que generara números aleatorios sin repeticion. Este programa tendria que tener una entrada de datos que nos preguntara la cantidad de números a generar y la cantidad de números que queremos que genere. Y que los que genere del total no este repetido ninguno.

He echo alguna cosilla con la funcion random y con el IDE de Python. Pero solo me genera numeros de una forma muy sencilla. Y encima, si quiero que me genere otro grupo de números aleatorios he de escribir de nuevo el programa. Osea, que si quiero modificar algo del codigo anterior el IDE no me deja.

Ya digo que estoy aprendiendo...eh!!!

Gracias y un saludo.
  #2 (permalink)  
Antiguo 20/12/2009, 11:59
 
Fecha de Ingreso: agosto-2008
Mensajes: 469
Antigüedad: 16 años, 2 meses
Puntos: 20
Respuesta: Números aleatorios sin repetición

Podrias poner el codigo de lo que ya tienes, asi los demas aprendemos y también nos podrian surgir ideas.

Saludos¡¡
__________________
Revisa las FAQ's antes de disparar.
  #3 (permalink)  
Antiguo 20/12/2009, 12:52
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Números aleatorios sin repetición

Como esta en las FAQ's, puedes hacerlo usando las funciones "range" y "shuffle"

http://www.forosdelweb.com/f130/faqs...3/#post3003469
  #4 (permalink)  
Antiguo 22/12/2009, 14:37
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Números aleatorios sin repetición

Cita:
Iniciado por Impostor Ver Mensaje
Podrias poner el codigo de lo que ya tienes, asi los demas aprendemos y también nos podrian surgir ideas.

Saludos¡¡

Pues como querais aprender de mi, estamos listos...¡Si yo estoy aprendiendo ahora!

Yo hice mas o menos esto: (eso si, copiado de un foro)

import random

for i in range(10):
print random.randint(1,30)
print

Y este programa nos da 10 numeros aleatorios en una horquilla del 1 al 30. El problema es que se repiten algunos numeros. Y yo no quiero que se repitan.

Pero ya digo, estoy muy verde en esto. La maximo que se de programacion lo aprendi con el Basic de un Spectrum 128K (aun me acuerdo con nostalgia...)
  #5 (permalink)  
Antiguo 22/12/2009, 14:38
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: Números aleatorios sin repetición

Cita:
Iniciado por razpeitia Ver Mensaje
Como esta en las FAQ's, puedes hacerlo usando las funciones "range" y "shuffle"

[URL]http://www.forosdelweb.com/f130/faqs-python-591053/#post3003469[/URL]
Gracias. Le echare un vistazo...
  #6 (permalink)  
Antiguo 23/12/2009, 12:12
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Números aleatorios sin repetición

Cita:
Iniciado por Koan Ver Mensaje
Código python:
Ver original
  1. import random
  2.  
  3. for i in range(10):
  4.     print random.randint(1,30)
  5.     print
Si ya sabes que serán números entre 1 y 30, puedes hacer una pequeña modificación a la sugerencia de razpeitia:

Código Python:
Ver original
  1. # generas la lista
  2. numeros = range(1, 30)
  3.  
  4. #la mezclas
  5. shuffle(numeros)
  6.  
  7. #obtienes los primeros 10
  8. mis_numeros = numeros[:10]

Si no sabes qué tantos números puedes llegar a generar, la solución es comprobar a cada caso si el número que generas ya está en la lista o no. Esta opción es más lenta y el rendimiento se degrada rápidamente dada la necesidad de revisar la lista entera cada vez, pero para generar una lista de pocos números funciona bien:

Código Python:
Ver original
  1. def aleatorios(cantidad, min, max):
  2.     numeros = []
  3.  
  4.     while len(numeros) < cantidad:
  5.         numero = random.randint(min, max)
  6.  
  7.         if not numero in numeros:
  8.             numeros.append(numero)
  9.  
  10.     return numeros


Saludos.
  #7 (permalink)  
Antiguo 24/12/2009, 16:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Números aleatorios sin repetición

Cita:
Iniciado por AlvaroG Ver Mensaje
Si no sabes qué tantos números puedes llegar a generar, la solución es comprobar a cada caso si el número que generas ya está en la lista o no. Esta opción es más lenta y el rendimiento se degrada rápidamente dada la necesidad de revisar la lista entera cada vez, pero para generar una lista de pocos números funciona bien:

Código Python:
Ver original
  1. def aleatorios(cantidad, min, max):
  2.     numeros = []
  3.  
  4.     while len(numeros) < cantidad:
  5.         numero = random.randint(min, max)
  6.  
  7.         if not numero in numeros:
  8.             numeros.append(numero)
  9.  
  10.     return numeros


Saludos.

Hola AlvaroG, cuanto tiempo sin leerte. Unas pequeñas aclaraciones, ese algoritmo se puede quedar en un ciclo infinito si la cantidad es mayor al margen, por ejemplo cantidad=30, min=1, max=10 jamas podra llenar la cantidad que se le pidio (por el principio del palomar). Recomendaría validar.

Otra cosa, es para evitar el if, puedes usar set (conjuntos) y al final pasarlo por la función list. Esto no se si sera mas eficiente.
  #8 (permalink)  
Antiguo 25/12/2009, 11:57
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Números aleatorios sin repetición

Cita:
Iniciado por razpeitia Ver Mensaje
Hola AlvaroG, cuanto tiempo sin leerte. Unas pequeñas aclaraciones, ese algoritmo se puede quedar en un ciclo infinito si la cantidad es mayor al margen, por ejemplo cantidad=30, min=1, max=10 jamas podra llenar la cantidad que se le pidio (por el principio del palomar). Recomendaría validar.
Principio del palomar... ufffff me trae recuerdos de una asignatura bastante molesta en la universidad jeje
Como era un ejemplo rápido no me fijé en los detalles, pero vale la aclaración por si este código resulta usado por alguien más en el futuro, gracias
Cita:
Iniciado por razpeitia Ver Mensaje
Otra cosa, es para evitar el if, puedes usar set (conjuntos) y al final pasarlo por la función list. Esto no se si sera mas eficiente.
Casi nunca recuerdo que en Python se puede usar conjuntos, y eso que fue una de las funciones que más me gustó del lenguaje cuando lo aprendí, y cuando leí el libro Learning Python.
Sin embargo, en este caso tienen un problema: los elementos se representan ordenados. Fijate en la salida de la función "modificada" que pego abajo para comprobarlo.

Para quienes no los conozcan, los conjuntos en Python son un tipo de objeto "colección de elementos sin repetición y sin orden", y que soporta las operaciones usuales de conjuntos.
Detalles:
http://docs.python.org/library/sets.html#set-objects
http://docs.python.org/library/stdtypes.html#set

Ahora un ejemplo con las sugerencias aplicadas, agregando también una comprobación de que max sea mayor que min

Código Python:
Ver original
  1. import random
  2.  
  3. def aleatorios(cantidad, min, max):
  4.     numeros = set()
  5.  
  6.     if max < min:
  7.         min, max = max, min
  8.  
  9.     if cantidad > (max-min):
  10.         print "solamente puedo generar %d numeros" % (max-min)
  11.         cantidad = max - min
  12.  
  13.     while len(numeros) < cantidad:
  14.         numeros.add(random.randint(min, max))
  15.  
  16.     return numeros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:26.