Generar números aleatorios sin repetición con Python

Una vez más aquí. Hoy vengo a dejar un pequeño artículo por que estos días me han enviado un correo electrónico en el que me han pedido una alternativa en Python del artículo Generar números aleatorios sin repeticiones con PHP. Este artículo lo escribí hace ya unos cuantos años, por eso me decidí a crear una nueva versión, y de paso echar una mano al usuari@ que lo necesita.

El código que vamos a ver en las siguientes líneas, es un pequeño programa de Python. En el vamos a utilizar la biblioteca gráfica tkinter para crear una interfaz de usuario simple, con la que generar números aleatorios únicos para el sorteo de Euromillones.

El código para crear un generador de números aleatorios sin repetición con Python

import random
import tkinter as tk

# crea una ventana
ventana = tk.Tk()

# establece el título de la ventana
ventana.title("Generador de números aleatorios para Euromillones con Python")

# tamaño de la ventana
ventana.geometry("500x300")

# crea una fuente en negrita para el texto
font_negrita = ("TkDefaultFont", 12, "bold")

# crea dos widgets Label y muestra los números generados y los números aleatorios
texto_numeros = tk.Label(ventana, text="Los números son:", font=font_negrita)
texto_numeros.pack(pady=10)

canvas_numeros = tk.Canvas(ventana, width=300, height=80)
canvas_numeros.pack(pady=10)

texto_estrellas = tk.Label(ventana, text="Las estrellas son:", font=font_negrita)
texto_estrellas.pack(pady=5)

canvas_estrellas = tk.Canvas(ventana, width=100, height=80)
canvas_estrellas.pack(pady=5)

# función para dibujar los círculos de las estrellas
def dibujar_estrellas(estrellas):
    canvas_estrellas.delete("all")
    x = 10
    for i in range(2):
        color = "Blue"
        canvas_estrellas.create_oval(x, 5, x+30, 35, width=2, fill=color)  # cambiar tamaño de círculo
        canvas_estrellas.create_text(x+15, 20, text=str(estrellas[i]), fill="white")  # centrar texto en círculo
        x += 40
        

# función para dibujar los círculos de los números
def dibujar_numeros(numeros):
    canvas_numeros.delete("all")
    x = 30
    y = 30
    for num in numeros:
        canvas_numeros.create_oval(x-20, y-20, x+20, y+20, width=2, fill="yellow")
        canvas_numeros.create_text(x, y, text=str(num), font=font_negrita)
        x += 60
        if x > 270:
            x = 30
            y += 60

# genera 5 números aleatorios únicos entre 1 y 50
def generar_numeros():
    numeros_generados = random.sample(range(1, 51), 5)
    numeros_generados.sort()

    # genera dos números aleatorios únicos entre 1 y 12 para las estrellas
    estrellas = random.sample(range(1, 13), 2)
    estrellas.sort()

    # actualiza las etiquetas de texto con los nuevos números y estrellas
    dibujar_numeros(numeros_generados)
    dibujar_estrellas(estrellas)

# genera los números y estrellas por primera vez
generar_numeros()

# crea un botón para generar nuevos números
boton_generar = tk.Button(ventana, text="Generar nuevos números", command=generar_numeros)
boton_generar.pack(anchor="center", expand=True)

# muestra la ventana
ventana.mainloop()

Una breve explicación del código

Comenzando por las importaciones, el código comienza importando dos bibliotecas: «random» y «tkinter«. La biblioteca «random» se utiliza para generar números aleatorios y la biblioteca «tkinter» se utiliza para crear la interfaz de usuario. Esta última biblioteca se abrevia a menudo como «tk» para facilitar su uso en el código.

La siguiente línea de código crea una ventana utilizando la clase Tk() de la biblioteca tkinter:

ventana = tk.Tk()

El siguiente paso es establecer el título de la ventana utilizando la función «title()«. Para este ejemplo, el título es «Generador de números aleatorios para Euromillones con Python«.

ventana.title("Generador de números aleatorios para Euromillones con Python")

A continuación, se establece el tamaño de la ventana utilizando la función «geometry()«. En este caso, la ventana tendrá un tamaño de 500 píxeles de ancho por 300 píxeles de alto.

ventana.geometry("500x300")

Después se define una fuente en negrita para el texto en la interfaz de usuario utilizando la variable «font_negrita». Esta variable define la fuente «TkDefaultFont» con un tamaño de 12 y un estilo en negrita.

font_negrita = ("TkDefaultFont", 12, "bold")

A continuación se crean dos etiquetas de texto utilizando la clase «Label» de tkinter. La primera etiqueta, «texto_numeros«, muestra el mensaje «Los números son:«. La segunda etiqueta, «texto_estrellas«, muestra el mensaje «Las estrellas son:«. Ambas etiquetas se definen con la fuente en negrita creada anteriormente y se ajustan en la ventana utilizando la función «pack()» de tkinter.

texto_numeros.pack(pady=10) 

texto_estrellas = tk.Label(ventana, text="Las estrellas son:", font=font_negrita) 

texto_estrellas.pack(pady=5)

A continuación, se crean dos «Canvas» utilizando la clase «Canvas» de tkinter. Hay que decir que un «Canvas» es un widget de tkinter que se utiliza para dibujar gráficos y formas en una ventana. El primer «Canvas«, «canvas_numeros«, se utiliza para dibujar los números aleatorios generados y el segundo «Canvas«, «canvas_estrellas«, se utiliza para dibujar las estrellas generadas. Ambos «Canvas» se ajustan en la ventana utilizando la función «pack()» de tkinter.

canvas_numeros = tk.Canvas(ventana, width=300, height=80) 

canvas_numeros.pack(pady=10) 

canvas_estrellas = tk.Canvas(ventana, width=100, height=80) 

canvas_estrellas.pack(pady=5)

Después, se definen dos funciones para dibujar los círculos de las estrellas y los números en los «Canvas» correspondientes.

La función dibujar_estrellas(estrellas) borra todo el contenido del canvas de las estrellas con el método delete("all") y luego dibuja dos círculos azules con el método create_oval. Los valores de posición y tamaño de los círculos se definen en la función con variables. Luego, se añade un número en cada círculo utilizando el método create_text, el cual recibe como parámetro la posición x e y del texto y el valor del número como string.

La función dibujar_numeros(numeros) también borra todo el contenido del canvas de los números con el método delete("all"). Luego, itera sobre cada número en la lista de números generados y dibuja un círculo amarillo y el número correspondiente utilizando los métodos create_oval y create_text, respectivamente. También se utilizan variables para definir la posición y tamaño de los círculos.

Finalmente, se define una función generar_numeros() que utiliza la librería random para generar 5 números aleatorios únicos entre 1 y 50 utilizando el método sample. Luego, genera dos números aleatorios únicos entre 1 y 12 para las estrellas. Estas dos listas son ordenadas en orden ascendente con el método sort(). Luego, se actualizan las etiquetas de texto con los nuevos números y estrellas utilizando las funciones dibujar_numeros(numeros_generados) y dibujar_estrellas(estrellas) respectivamente.

Por último, se crea un botón que llama a la función generar_numeros() cada vez que es presionado y se muestra la ventana con el método mainloop().

En resumen, este código utiliza la librería tkinter de Python para crear una ventana que muestra números y estrellas generados aleatoriamente con los que poder jugar al sorteo de Euromillones. Esto no garantiza ni más ni menos posibilidades de que toque un premio. Tan solo es otra forma de crear un listado de números con Python, como me ha pedido el usuari@ por correo. Eso si, si a alguien le toca, que sepa que yo acepto donaciones a la causa …

Post relacionados

Organizador de listas M3U. Gestión y reproducción con facilidad

Ideas y conexiones. Crea, visualiza y conecta ideas entre si

Añade datos a una hoja Excel mediante un formulario tkinter