Ver Mensaje Individual
  #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