sábado, 4 de agosto de 2018

Generar números aleatorios sin repetición y ordenarlos en Python

Reto: Ordenar números

Imprimir una lista de 10 números aleatorios sin repetición que varíen en el rango 80 a 99. Volver a imprimir la lista pero ordenada.




Método 1

Definimos la función unico que tiene dos argumentos. La función, dado el número x y la lista L, detecta si x es único o esta repetido. Si el número x no está en la lista entonces retorna True, y si el número se encuentra ya en la lista entonces devuelve False.
El bucle while nos proporciona los 10 números aleatorios sin repetición que ha de llegar a tener la lista. En este caso el bucle ha de ser del tipo while, no valdría un for, ya que no conocemos el número de ciclos que serán necesarios, puesto que si no existen repeticiones serán 10 ciclos pero si las hay el número aumenta. Por cada repetición encontrada se ha de generar un nuevo x aleatorio. Los x únicos generados se anexionan a la lista con append.
Finalmente se imprime la lista L y se ordena con sort.




import random
def unico(x,L):
  esUnico=True
  for i in range(len(L)):
    if x==L[i]:
      esUnico=False
      break
  return esUnico
L=[]
j=0
while j<10:
  x=random.randint(80,99)
  if unico(x,L):
    L.append(x)
    j+=1
print(L)
L.sort()
print(L)


Método 2

Inicializamos la lista L con su primer valor, el de la posición cero. Esto se hace fuera del bucle while ya que el primer x estamos seguros de que no se repite respecto a los anteriores, ya que es el primero. Luego nos metemos en un bucle while que genera los demás x aleatorios que de momento son candidatos, hasta que no se compruebe que no están repetidos entre los elementos que ya se encuentran en la lista. Para conseguir establecer si el número candidato se ha de anexionar a la lista o no se hace usando un bucle for que contiene un condicional if. La clave está en el else que no pertenece al if sino al for.
Finalmente imprimimos la lista L y la ordenamos con sorted.

import random
L=[random.randint(80, 99)] #este es L[0]
i=1
while i<10:
  x=random.randint(80,99)
  for j in range(0, len(L)):
    if L[j]==x:
      break
  else:
    L.append(x)
    i+=1
print(L)
print(sorted(L))


Método 3

Esta es una variante del método anterior que mejora el código ya que usa en el if la instrucción in, o mejor dicho, not in, para detectar si el nuevo número aleatorio se encuentra entre los que ya se han añadido a la lista L.


import random
L=[random.randint(80, 99)] #este es L[0]
i=1
while i<10:
  x=random.randint(80,99)
  if x not in L:
    L.append(x)
    i+=1
print(L)
print(sorted(L))


Método 4

Importamos únicamente el método sample de la librería random que permite crear una lista eligiendo aleatoriamente 10 valores de un rango de números creado con range que varía entre 80 y 100 (excluido el 100).

Con sorted ordenamos la lista . Si deseamos que la ordenación sea inversa tendremos que indicarlo poniendo print(sorted(L,reverse=True)).

from random import sample
L=sample(range(80,100),10)
print(L)
print(sorted(L))


Método 5

Este método, al igual que el anterior, utiliza sample para elegir una muestra aleatoria entre los posibles valores que generamos utilizando List Comprehension.
Faltaría ordenar la lista, pero hemos preferido dejar el código así para que se vea que en dos líneas se puede llegar a obtener la lista de aleatorios sin repetición.


from random import sample
print(sample([x for x in range(80,100)],10))


Método 6

Creamos la lista L usando list y range. Esta lista contendrá todos los números enteros consecutivos entre 80 y 99. La instrucción random.shuffle(L) baraja aleatoriamente la lista L. Creamos la lista L10 que contendrá los 10 primeros elementos de la lista L. Imprimimos la lista L10. Ordenamos la lista L10 en sentido inverso usando sort. Si la queremos ordenar en sentido creciente simplemente dejaremos vacío lo que va entre sus paréntesis. Sería L10.sort().


import random
L=list(range(80,100))
random.shuffle(L) #baraja la lista
L10=L[:10] #crea otra lista con los 10 primeros elementos
print(L10)
L10.sort(reverse=True) #ordena la lista L10
print(L10)

6 comentarios:

  1. El problema resuelto verdaderamente sería sin usar el método sort.

    ResponderEliminar
  2. Muchisimas Gracias! Me ayudo bastante. Sigue así, saludos!

    ResponderEliminar
  3. Excelente aporte, pero si quisiera que aparecieran mas listados de numeros en el for agrego la variable o tendria que ser en la impresion?

    ResponderEliminar
  4. import random

    nums = []
    for i in range(11):
    num = random.randint(80, 99)
    while num in nums:
    num = random.randint(80, 99)
    nums.append(num)

    print(nums)
    print(sorted(nums))

    Asi lo hice yo despues de un ratico comiendome el coco

    ResponderEliminar
    Respuestas
    1. El comentario me quita la indetacion

      Eliminar
    2. Le entendi la logica, pero lo probe e imprime una matriz vacía, le modifique un poco a tu código y me quedo asi:

      import random
      nums = [random.randint(80,100)]
      for i in range(9):
      (1Tab)num = random.randint(80, 100)
      (1Tab)while num in nums:
      (2Tab)num = random.randint(80, 100)
      (1Tab)nums.append(num)
      print(nums)
      print(sorted(nums))

      Le pongo 1Tab o 2Tab para indicar las tabulaciones correspondientes

      Eliminar