La aleatoriedad aparece en juegos, simulaciones, sorteos, pruebas y pequeños proyectos de automatización. Python incluye el módulo random en su biblioteca estándar, por lo que puedes generar números pseudoaleatorios, elegir elementos y mezclar listas sin instalar paquetes adicionales.
En esta guía aprenderás a utilizar random(), randint(), randrange(), uniform(), choice(), choices(), sample(), shuffle() y seed(). También veremos una regla importante: para contraseñas, tokens y códigos de seguridad debes utilizar secrets, no random.
Qué hace el módulo random
El módulo genera valores pseudoaleatorios. Los resultados parecen impredecibles para un usuario, pero proceden de un algoritmo determinista. Eso lo hace rápido y adecuado para juegos, ejemplos, simulaciones sencillas y datos de prueba reproducibles.
import randomLa documentación oficial de random reúne todas las distribuciones y operaciones disponibles.
Generar un número decimal con random()
random.random() devuelve un número de punto flotante desde 0.0 hasta un valor menor que 1.0.
import random
valor = random.random()
print(valor)Puedes escalarlo, aunque normalmente existen funciones más claras:
porcentaje = random.random() * 100
print(f"{porcentaje:.2f}%")Generar enteros con randint() y randrange()
randint(a, b) incluye ambos límites. Para simular un dado:
dado = random.randint(1, 6)
print(dado)randrange() utiliza límites similares a range(): el valor final queda excluido y puedes indicar un paso.
numero = random.randrange(10) # de 0 a 9
multiplo = random.randrange(0, 101, 5)
print(numero, multiplo)Este patrón es útil en un juego de adivinación con Python.
Valores decimales con uniform()
uniform(a, b) devuelve un valor decimal dentro de un intervalo.
temperatura = random.uniform(18.0, 30.0)
print(f"Temperatura simulada: {temperatura:.1f} °C")Es apropiado para ejemplos y simulaciones básicas, pero no sustituye un modelo estadístico real.
Elegir un elemento con choice()
choice() selecciona un elemento de una secuencia no vacía.
colores = ["rojo", "verde", "azul", "amarillo"]
elegido = random.choice(colores)
print(elegido)Si la secuencia está vacía, Python genera IndexError. Valida la lista cuando pueda no contener datos.
sample() y choices(): sin reemplazo o con reemplazo
sample(poblacion, k)devuelve elementos sin repetir posiciones.choices(poblacion, k=k)permite repeticiones.
participantes = ["Ana", "Luis", "Marta", "Diego", "Sofía"]
equipo = random.sample(participantes, k=3)
sorteos = random.choices(participantes, k=5)
print("Equipo:", equipo)
print("Sorteos:", sorteos)sample() genera ValueError cuando k es mayor que la población.
Elecciones con pesos
premios = ["pequeño", "mediano", "grande"]
pesos = [70, 25, 5]
resultado = random.choices(premios, weights=pesos, k=1)[0]
print(resultado)Los pesos representan proporciones relativas y no necesitan sumar 100.
Mezclar una lista con shuffle()
shuffle() modifica la lista original y devuelve None.
cartas = ["A", "K", "Q", "J", "10"]
random.shuffle(cartas)
print(cartas)Para conservar el orden original, crea una copia:
original = [1, 2, 3, 4, 5]
mezclada = original.copy()
random.shuffle(mezclada)
print(original)
print(mezclada)Resultados reproducibles con seed()
Una semilla fija permite repetir una secuencia durante una clase, una depuración o una prueba.
random.seed(42)
print(random.randint(1, 100))
print(random.randint(1, 100))La semilla sirve para reproducibilidad, no para seguridad.
Usar una instancia independiente
generador = random.Random(42)
print(generador.choice(["norte", "sur", "este", "oeste"]))
print(generador.random())Una instancia separada evita modificar el estado global y facilita las pruebas automatizadas.
random no sirve para contraseñas ni tokens
El generador predeterminado es determinista y no está diseñado para criptografía. Para proteger cuentas o acciones sensibles, utiliza secrets.
import secrets
codigo = secrets.randbelow(900000) + 100000
token = secrets.token_urlsafe(32)
print(codigo)
print(token)Consulta la documentación oficial de secrets para conocer las funciones seguras.
Proyecto práctico: crear grupos equilibrados
import random
def crear_grupos(nombres, cantidad, semilla=None):
if cantidad < 1:
raise ValueError("La cantidad debe ser al menos 1")
if cantidad > len(nombres):
raise ValueError("No puede haber más grupos que personas")
generador = random.Random(semilla)
mezclados = list(nombres)
generador.shuffle(mezclados)
grupos = [[] for _ in range(cantidad)]
for indice, nombre in enumerate(mezclados):
grupos[indice % cantidad].append(nombre)
return grupos
personas = ["Ana", "Luis", "Marta", "Diego", "Sofía", "Pablo"]
for numero, grupo in enumerate(crear_grupos(personas, 3, semilla=7), start=1):
print(f"Grupo {numero}: {', '.join(grupo)}")El proyecto combina listas, copia de datos, mezcla, módulo y enumerate().
Errores frecuentes
- Usar
randint(0, len(lista))como índice y obtener un valor fuera del rango. - Esperar que
shuffle()devuelva una lista nueva. - Pedir en
sample()más elementos de los disponibles. - Utilizar
randompara claves, sesiones o enlaces de recuperación. - Dejar una semilla fija en producción sin querer.
- Suponer que un resultado aleatorio representa correctamente un fenómeno real.
Preguntas frecuentes
¿Necesito instalar random?
No. Forma parte de la biblioteca estándar de Python.
¿randint() incluye el límite superior?
Sí. randint(1, 6) puede devolver 1 y 6.
¿Cómo elijo ganadores sin repetir?
Utiliza random.sample(participantes, k=cantidad).
¿Qué debo usar para tokens seguros?
Utiliza secrets.token_urlsafe(), secrets.token_hex() u otra función del módulo secrets.
Conclusión
El módulo random de Python ofrece herramientas sencillas para números, selecciones y mezclas. Usa randint() para enteros, choice() para un elemento, sample() para selecciones únicas, choices() para resultados repetidos o ponderados y shuffle() para cambiar el orden de una lista.
Utiliza semillas cuando la reproducibilidad sea útil y cambia a secrets en cualquier situación relacionada con seguridad.
Lecturas relacionadas
- Repasa las operaciones y copias utilizadas en esta guía en el artículo sobre listas de Python.
- Para aplicar aleatoriedad segura en un proyecto real, consulta cómo crear un generador seguro de contraseñas con Python.

