🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

¡Introducción al módulo random de Python! Cómo generar valores aleatorios con código para copiar y pegar

Para ejecutar Python desde el símbolo del sistema o PowerShell en tu PC, necesitas descargar e instalar Python.
Si aún no lo has hecho, consulta el artículo Instalación de Python y configuración del entorno de desarrollo para instalar Python.

¡Hola! ¿Alguna vez has querido añadir un poco de dinamismo o imprevisibilidad a tu sitio web? Por ejemplo, cambiando la imagen que se muestra cada vez que alguien visita, mostrando artículos recomendados al azar, o generando muchos datos de prueba durante el desarrollo.

Para lograr esta "aleatoriedad", Python proporciona una biblioteca estándar muy conveniente llamada el módulo random. Como es una biblioteca estándar, no se necesita instalación adicional si tienes Python, lo que la convierte en un aliado confiable para los creadores web.

En este artículo, explicaremos a fondo cómo usar el módulo random de Python, desde lo básico hasta las aplicaciones, con abundantes códigos de muestra, para que incluso los creadores web principiantes puedan empezar a usarlo de inmediato. Todo el código de muestra está diseñado para funcionar perfectamente con solo copiar y pegar. ¡Al "simplemente probarlo", puedes experimentar la diversión y la conveniencia de la generación de números aleatorios!


Preparación: Importar el módulo random

Lo primero es lo primero, para usar las funciones del módulo random, necesitas importarlo al principio de tu script de Python. Es muy simple; solo necesitas escribir la siguiente línea.

import random

# A partir de aquí, puedes usar las funciones del módulo random.
print("¡El módulo random ha sido importado!")

Ahora estás listo para llamar a varias funciones dentro del módulo usando el formato random.nombre_funcion(). Echemos un vistazo a algunas de las funciones más comunes una por una.


Parte 1: Generar enteros aleatorios (randint, randrange)

Una de las características más utilizadas es generar un entero aleatorio dentro de un rango específico. Esto es muy útil en muchas situaciones donde necesitas un entero aleatorio, como "un número del 1 al 6 (un lanzamiento de dado 🎲)" o "una puntuación de examen de 100 a 200."

Obtener un entero en un rango especificado: random.randint()

random.randint(a, b) devuelve un entero aleatorio entre los dos números `a` y `b` pasados como argumentos. Un punto importante es que este rango es inclusivo tanto de a como de b (mayor o igual que a y menor o igual que b).

Ejemplo: Un entero aleatorio del 1 al 6 (un lanzamiento de dado)

import random

# Generar un entero aleatorio del 1 al 6 (inclusive)
resultado_dado = random.randint(1, 6)

print(f"El resultado del dado es: {resultado_dado}")

Úsalo como range(): random.randrange()

random.randrange() también genera enteros, pero funciona igual que la función estándar range() de Python. Por esta razón, podría parecer más intuitivo para los programadores.

A diferencia de randint(a, b), ten en cuenta que el valor final (stop) no está incluido en el rango.

Ejemplo: Un entero aleatorio del 0 al 9 (10 no está incluido)

import random

# Generar un entero aleatorio desde 0 hasta (pero sin incluir) 10
# Misma lógica que range(10)
numero = random.randrange(10)

print(f"Un número aleatorio del 0 al 9: {numero}")

El verdadero poder de randrange() se muestra cuando quieres generar números aleatorios con un paso (intervalo) específico. Por ejemplo, puedes especificar "solo números pares" o "solo múltiplos de 5."

Ejemplo: Un múltiplo de 5 aleatorio del 10 al 100

import random

# Empezar en 10, hasta (pero sin incluir) 101, con un paso de 5
# Los candidatos son 10, 15, 20, ..., 100
multiplo_de_cinco = random.randrange(10, 101, 5)

print(f"Un múltiplo de 5 aleatorio del 10 al 100: {multiplo_de_cinco}")

Parte 2: Elegir elementos de una lista (choice, choices, sample)

Esta es una función muy útil para situaciones como "mostrar un artículo aleatorio de una lista de artículos recomendados" o "mostrar algunas imágenes de banner seleccionadas de entre varias" en un sitio web. Extrae elementos de una colección (secuencia) como una lista o tupla.

Elegir solo uno: random.choice()

random.choice(seq) elige solo un elemento aleatorio de una secuencia como una lista o tupla. Es una función simple y muy fácil de usar.

Ejemplo: Elegir una fortuna de un papel de la suerte

import random

fortunas = ["Gran Bendición", "Bendición Media", "Pequeña Bendición", "Bendición", "Maldición", "Gran Maldición"]

# Elegir un elemento aleatorio de la lista
resultado = random.choice(fortunas)

print(f"Tu fortuna para hoy es... ¡{resultado}!")

Elegir varios con reemplazo: random.choices()

random.choices(population, k=n) elige múltiples elementos de una lista. El punto importante es que permite duplicados (muestreo con reemplazo). Esto significa que un elemento que ha sido elegido una vez puede ser elegido de nuevo. Especificas el número de elementos a elegir con k.

Ejemplo: Una simulación de lanzar una moneda 10 veces (Cara y Cruz se eligen con reemplazo)

import random

caras_moneda = ["Cara", "Cruz"]

# Elegir 10 veces de caras_moneda con reemplazo (k=10)
resultados = random.choices(caras_moneda, k=10)

print(f"Resultados del lanzamiento de la moneda: {resultados}")
print(f"Número de Caras: {resultados.count('Cara')}")
print(f"Número de Cruces: {resultados.count('Cruz')}")

Además, choices() te permite especificar weights (pesos), lo que puede cambiar la probabilidad de que cada elemento sea elegido. Esto es muy útil para situaciones en las que quieres manipular probabilidades, como en la función de gacha de un juego.

Ejemplo: Una simulación de un sistema de gacha donde los artículos de alta rareza son menos probables de aparecer

import random

articulos = ["Súper Raro SSR+", "SSR", "SR", "R", "N"]
#         Probabilidad:  0.5%,      3%,   15%,  30%, 51.5% pesos correspondientes
pesos = [0.5,       3,    15,    30,   51.5]

# Realizar 10 sorteos considerando los pesos
resultados_gacha = random.choices(articulos, weights=pesos, k=10)

print(f"Resultados del gacha de 10 tiradas: {resultados_gacha}")

Elegir varios sin reemplazo: random.sample()

random.sample(population, k) elige múltiples elementos de una lista sin duplicados (muestreo sin reemplazo). Es ideal para situaciones como "sortear 3 ganadores de una lista de participantes sin duplicados" o "asegurarse de que los artículos relacionados mostrados no se solapen."

Ejemplo: Sortear 2 ganadores de 5 usuarios

import random

usuarios = ["UsuarioA", "UsuarioB", "UsuarioC", "UsuarioD", "UsuarioE"]

# Elegir 2 personas de la lista de usuarios sin duplicados (k=2)
ganadores = random.sample(usuarios, k=2)

print(f"¡Felicidades a los ganadores!: {ganadores}")

Parte 3: Barajar el orden de una lista (shuffle)

Si quieres reordenar aleatoriamente los elementos de una lista existente, usa random.shuffle(x).

Como punto de precaución, shuffle() no devuelve una nueva lista, sino que modifica la lista original directamente (operación in-place). Por lo tanto, si quieres mantener el orden original, deberías usarlo después de copiar la lista.

Ejemplo: Barajar una baraja de cartas

import random

cartas = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
print(f"Antes de barajar: {cartas}")

# Reordenar aleatoriamente la propia lista de cartas
random.shuffle(cartas)

print(f"Después de barajar: {cartas}")

Si quieres obtener una "nueva" lista barajada manteniendo la lista original, es fácil usar el ya mencionado random.sample(). Si especificas el número total de elementos de la lista para k, obtendrás como resultado una nueva lista barajada.

Ejemplo: Obtener una lista barajada manteniendo la lista original

import random

lista_original = [1, 2, 3, 4, 5]

# Muestrear tantos elementos como la longitud de la lista original
lista_barajada = random.sample(lista_original, k=len(lista_original))

print(f"Lista original (sin cambios): {lista_original}")
print(f"Nueva lista barajada: {lista_barajada}")

Parte 4: Generar números de punto flotante aleatorios (random, uniform)

Puedes generar no solo enteros, sino también números aleatorios que incluyen un punto decimal (números de punto flotante). Esto se puede usar para parámetros de animación o para calcular proporciones en pruebas A/B.

Un valor entre 0.0 y 1.0: random.random()

random.random() es la función más básica para generar decimales, devolviendo un número de punto flotante aleatorio que es mayor o igual que 0.0 y menor que 1.0 ($0.0 \le N < 1.0$). No requiere argumentos.

Ejemplo: Generar un número de punto flotante aleatorio

import random

valor = random.random()
print(f"Valor generado: {valor}")

# Ejemplo de mostrar "¡Éxito!" con una probabilidad del 70%
if valor < 0.7:
    print("¡Éxito con una probabilidad del 70%!")
else:
    print("Lástima, fracaso...")

Un decimal en un rango especificado: random.uniform()

Si quieres un decimal dentro de un rango específico, usa random.uniform(a, b). Esto devuelve un número de punto flotante aleatorio que es mayor o igual que a y menor o igual que b ($a \le N \le b$).

Ejemplo: Generar un decimal aleatorio de -1.0 a 1.0

import random

# Generar un decimal aleatorio de -1.0 a 1.0
decimal_aleatorio = random.uniform(-1.0, 1.0)

print(f"Decimal generado: {decimal_aleatorio}")

# Si quieres mostrarlo con 3 decimales
print(f"Con 3 decimales: {decimal_aleatorio:.3f}")

Aplicaciones: Muestras prácticas para la producción web

A partir de aquí, presentaremos ejemplos más prácticos que los creadores web podrían usar en el desarrollo real, combinando las funciones básicas que hemos aprendido hasta ahora.

Aplicación 1: Generar contraseñas o cadenas de ID aleatorias

Esto es útil cuando quieres generar contraseñas iniciales para usuarios de prueba o IDs de sesión temporales. Aquí, presentamos una forma inteligente de escribir esto combinando random.choice() con manipulación de cadenas y comprensiones de listas.

import random
import string

# Definir los caracteres candidatos
# string.ascii_letters son todas las letras inglesas (a-z, A-Z)
# string.digits son números (0-9)
# string.punctuation son símbolos (!"#$%&...)
caracteres = string.ascii_letters + string.digits + string.punctuation
print(f"Caracteres candidatos parciales: {caracteres[:20]}...")

# Especificar la longitud de la contraseña
longitud = 16

# Generar una cadena aleatoria de la longitud especificada usando una comprensión de lista
# "".join(lista) concatena los elementos de una lista en una sola cadena
contrasena_aleatoria = "".join(random.choice(caracteres) for _ in range(longitud))

print(f"Cadena aleatoria generada: {contrasena_aleatoria}")

Aplicación 2: Generar HTML con elementos aleatorios usando Python

Python también está activo en el lado del servidor web. Aquí, presentamos código que genera dinámicamente un archivo HTML con contenido aleatorio. Esto es útil cuando quieres crear eficientemente prototipos o datos de prueba para un sitio web.

El siguiente código de Python genera un archivo HTML simple con un color de fondo diferente y un mensaje diferente cada vez que se ejecuta.

Código de Python: Generando HTML aleatorio

import random

# 1. Generar un código de color aleatorio
# Convertir un entero de 0 a 16777215 (FFFFFF) a un número hexadecimal
color_fondo = f"#{random.randint(0, 0xFFFFFF):06x}"

# 2. Seleccionar un mensaje e icono aleatorios
mensajes = [
    ("¡Bienvenido al mundo de Python!", "🐍"),
    ("El módulo random es práctico, ¿verdad?", "👍"),
    ("¡El diseño web es divertido!", "🎨"),
    ("Hoy es un gran día para programar.", "💻")
]
mensaje, icono = random.choice(mensajes)

# 3. Crear la estructura HTML con una f-string
contenido_html = f"""<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Página Generada Aleatoriamente</title>
    <style>
        body {{
            background-color: {color_fondo};
            color: #333;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            text-align: center;
            padding-top: 100px;
            transition: background-color 0.5s ease;
        }}
        .container {{
            background-color: rgba(255, 255, 255, 0.8);
            padding: 2em 3em;
            border-radius: 12px;
            display: inline-block;
            box-shadow: 0 8px 20px rgba(0,0,0,0.15);
            backdrop-filter: blur(10px);
        }}
        h1 {{
            font-size: 2.5rem;
        }}
    </style>
</head>
<body>
    <div class="container">
        <h1>{icono} {mensaje}</h1>
        <p>El color de fondo de esta página es <strong>{color_fondo}</strong>.</p>
    </div>
</body>
</html>
"""

# 4. Guardar el HTML generado en un archivo llamado "random_page.html"
with open("random_page.html", "w", encoding="utf-8") as f:
    f.write(contenido_html)

print("Se ha generado `random_page.html`. Por favor, ábrelo en un navegador para comprobarlo.")

Cuando ejecutes el script de Python anterior, se creará un archivo llamado `random_page.html` en el mismo directorio que el script. Si abres este archivo en un navegador, debería mostrarse una página con un diseño diferente cada vez. ¡Por favor, pruébalo!

Puntos a tener en cuenta y uso avanzado

Reproducibilidad de los números aleatorios: random.seed()

Los números aleatorios generados por el módulo random en realidad no son completamente aleatorios, sino números pseudoaleatorios generados por un cálculo (algoritmo) específico. El punto de partida para este cálculo es un valor llamado "semilla" (seed).

Normalmente, la semilla se establece automáticamente a partir de un valor impredecible como la hora actual, por lo que se genera una secuencia diferente de números aleatorios cada vez que se ejecuta. Sin embargo, para la depuración o las pruebas, es posible que desees generar "valores aleatorios, pero la misma secuencia de valores aleatorios cada vez". Esto se logra con random.seed().

Si le das un número específico (valor de semilla) a random.seed(), la secuencia de números aleatorios generada a partir de ese momento quedará completamente fija. No importa cuántas veces lo ejecutes, los mismos números aleatorios aparecerán en el mismo orden a partir del mismo valor de semilla.

import random

# Establecer el valor de la semilla en 42
random.seed(42)
print("--- Ejecutando con valor de semilla 42 ---")
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())

print("\n--- Ejecutando de nuevo con valor de semilla 42 ---")
# Si vuelves a establecer la semilla con el mismo valor, la secuencia de números aleatorios se restablecerá y obtendrás exactamente el mismo resultado
random.seed(42)
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())

【Lo más importante】Usa el módulo secrets para fines de seguridad

Advertencia: Este es un punto muy importante.

El módulo random que hemos presentado hasta ahora es suficiente para la aleatoriedad estadística y el uso general, pero su algoritmo es de conocimiento público, y los números aleatorios que genera son predecibles, por lo que no es criptográficamente seguro.

En otras palabras, no debes usar el módulo random para funciones de aplicaciones web críticas para la seguridad, como:

  • Generación de contraseñas de usuario o tokens de restablecimiento
  • IDs de sesión o tokens de autenticación
  • Generación de claves de API
  • Cualquier otro valor secreto que no deba ser adivinado por un tercero

Para estos fines, debes usar el módulo dedicado para generar números aleatorios criptográficamente seguros, secrets, que se ha añadido a la biblioteca estándar desde Python 3.6.

El uso del módulo secrets es muy similar al del módulo random, pero utiliza la fuente de aleatoriedad más segura proporcionada por el sistema operativo, lo que hace que sea extremadamente difícil de predecir por un tercero.

Ejemplo: Generar un token seguro con el módulo secrets

import secrets
import string

# --- Generar un token seguro para URL (32 bytes) ---
# Se puede usar para URLs de restablecimiento de contraseña, etc.
token_seguro_url = secrets.token_urlsafe(32)
print(f"Token seguro para URL: {token_seguro_url}")


# --- Ejemplo de generación de una contraseña segura (16 caracteres) ---
# Usar caracteres alfanuméricos y símbolos como caracteres candidatos
alfabeto = string.ascii_letters + string.digits + string.punctuation
# Usar secrets.choice() para elegir caracteres de forma segura
contrasena_segura = ''.join(secrets.choice(alfabeto) for i in range(16))
print(f"Ejemplo de contraseña segura: {contrasena_segura}")

Resumen

En este artículo, hemos explicado en detalle todo, desde los conceptos básicos de la generación de números aleatorios usando el módulo random de Python hasta ejemplos prácticos de aplicación en la producción web y precauciones de seguridad importantes.

Finalmente, repasemos las funciones principales una vez más.

Al dominar estas funciones, puedes crear fácilmente datos de prueba en el desarrollo web o añadir un poco de sorpresa e interactividad a la experiencia del usuario. ¡Por favor, copia y pega el código que hemos presentado y haz tuya la función de generación aleatoria ejecutándola tú mismo!


🚀 Próximos pasos

Una vez que te sientas cómodo con la manipulación de datos en Python, vamos a abordar las "expresiones regulares", una poderosa herramienta para la manipulación de cadenas. Hará que la búsqueda y el reemplazo de datos de texto complejos sean mucho más fáciles.

Próximo artículo: Uso del módulo re para búsqueda y reemplazo de cadenas con expresiones regulares