01 · Punto de partida
Todo simulador necesita azar
Querés simular una fila de banco, el tráfico de una red o el daño crítico de un videojuego. En todos los casos hay algo que no podés predecir de antemano: cuándo llega el próximo cliente, qué paquete se pierde, si el dado da 6. Esa incertidumbre es la aleatoriedad, y sin ella tus simulaciones serían películas siempre idénticas, incapaces de mostrar variabilidad.
El problema es que la intuición nos engaña con el azar: vemos patrones donde no hay, creemos que «ya toca» un resultado, o pensamos que aleatorio significa desordenado a simple vista. Este tema pone los pies sobre la tierra antes de programar generadores.
- ¿Qué significa exactamente que un resultado sea aleatorio?
- ¿Por qué no podés adivinar el próximo valor aunque conozcas todos los anteriores?
- ¿Cómo puede haber orden estadístico en algo impredecible?
- ¿Qué parte del azar puede imitar una computadora?
02 · Definición
¿Qué es aleatorio?
Un fenómeno es aleatorio cuando interviene el azar en su resultado: hay varios resultados posibles, no podés anticipar con certeza cuál ocurrirá, pero el experimento se puede repetir en condiciones similares. Tirar una moneda, medir el tiempo entre dos colectivos o sortear un número son ejemplos.
Imprevisible
El próximo resultado no se puede deducir del pasado. Saber que salieron 5 caras seguidas no te dice qué saldrá ahora.
Sin patrón obligatorio
No hay memoria ni ciclo escondido que te permita acertar siempre. Las rachas (CCCCC) también son normales en el azar.
Regular en masa
En miles de repeticiones aparecen proporciones estables: ~50 % caras, ~1/6 para cada cara del dado. Esa es la base de la simulación.
Esta doble cara es la que hace útil al azar: si todo fuera impredecible incluso en masa, no podríamos modelar nada; si el caso individual fuera predecible, no sería azar.
| Fenómeno | ¿Próximo resultado? | ¿Miles de repeticiones? |
|---|---|---|
| Tirar un dado equilibrado | Impredecible (1 a 6) | Cada cara ~16,7 % |
| Calcular 2 + 2 | Siempre 4 | Siempre 4 |
| Tiempo entre clientes | Impredecible | Promedio y distribución estables |
| Contar de 1 en 1 | Totalmente predecible | Secuencia fija |
03 · Vocabulario mínimo
Cuatro palabras para hablar de azar
Para programar azar no necesitás teoría matemática completa, pero sí cuatro nombres precisos. Los usaremos en todo el curso:
- Resultado
- Cada desenlace posible: cara, ceca, 1, 2, 3, 4, 5, 6. (Temas 21–22 lo convertiremos en intervalos y enteros.)
- Espacio muestral
- El conjunto de todos los resultados: {cara, ceca} o {1, 2, 3, 4, 5, 6}. Define «qué puede salir».
- Evento
- Una pregunta sobre el resultado: «¿salió par?», «¿salió mayor que 4?». Es lo que contarás en el código.
- Frecuencia relativa
- Veces que ocurrió un evento dividido el total: si el 6 salió 1020 veces en 6000 tiros, su frecuencia es 0,17. Tiende a estabilizarse.
Azar genuino
Nadie lo puede predecir
Proviene de un proceso físico irrepetible en detalle: ruido térmico, decaimiento, el giro exacto de la moneda.
Azar imitado
Parece azar, pero es cálculo
Lo que hará tu programa en los próximos temas: una fórmula determinista que produce secuencias indistinguibles del azar a simple vista.
04 · Ejemplos
El azar que un programador debe simular
El mismo patrón aparece en juegos, negocios y ciencia. Reconocerlo te permite reutilizar las mismas herramientas de generación:
- 1Moneda.
Resultados: cara o ceca. Evento típico: proporción de caras en 1000 tiros. Base de todo test de uniformidad.
- 2Dado.
Resultados: 1 a 6. Evento típico: ¿sale un 6? ¿sale par? Primer ejemplo de enteros aleatorios.
- 3Sorteo y loot (botín/recompensas del juego).
Resultados: ítems con distinta rareza. Evento típico: elegir un ganador o un objeto con probabilidad ponderada.
- 4Llegadas.
Resultados: segundos entre clientes o paquetes. Evento típico: cuántos llegan en una hora pico.
- 5Medición con ruido.
Resultados: sensor que oscila alrededor del valor real. Evento típico: promediar para filtrar el ruido.
05 · Primer contacto en Python
Generar azar con una línea
Python incluye el módulo random, que por ahora usaremos como «caja negra» para experimentar con la aleatoriedad. Más adelante (Temas 5 y 12) abriremos la caja: verás que por dentro hay una semilla y una fórmula determinista.
Python en tu navegador. Los bloques de esta página se ejecutan localmente con Pyodide, sin instalar nada. La primera ejecución tarda unos segundos; podés editar el código y volver a ejecutarlo.
import random
for i in range(10):
print(random.random())
Ejecutalo dos veces: ¿obtuviste los mismos 10 números? ¿Podrías haberlos adivinado antes de ejecutar? Esa es la sensación de imprevisibilidad.
Del [0,1) al dado
El bloque anterior genera decimales en [0,1): mayores o iguales a 0 y menores que 1. Con randint obtenés enteros como los de un dado. Contar frecuencias es tu primera «prueba de calidad» intuitiva:
import random
tiros = [random.randint(1, 6) for _ in range(6000)]
for cara in range(1, 7):
frec = tiros.count(cara) / len(tiros)
print(cara, round(frec, 4))
06 · Exploración
Laboratorio: mil monedas y la regularidad
Elegí cuántas monedas lanzar. Cada punto es la proporción acumulada de caras hasta ese tiro. Al principio oscila mucho; con cientos de tiros se pega a 0,5. Eso es «caso impredecible, conjunto predecible» en acción.
Proporción de caras según N
p(n) = caras / n → 0,5
Mové el control o lanzá de nuevo para ver otra secuencia.
La línea muestra cómo la proporción de caras se estabiliza cerca de 0,5 cuando N crece. La línea punteada marca el 0,5 teórico.
Preguntas para explorar
- Con N = 10, lanzá 5 veces. ¿La proporción final varía mucho entre intentos? ¿Y con N = 2000?
- ¿Alguna secuencia tuvo 4 o 5 caras seguidas al inicio? ¿Eso contradice que la moneda sea justa?
- Si después de 3 caras seguidas alguien dice «ya toca ceca», ¿qué le respondés con este gráfico?
Ver respuestas sugeridas
- Con N chico la dispersión es grande (0,3 a 0,7 es normal); con N grande casi siempre cae entre 0,47 y 0,53. La variabilidad se achica con N.
- No: las rachas cortas son esperables. En 500 tiros es raro no ver rachas de 5 o 6. El azar no alterna prolijamente.
- Que la moneda no tiene memoria: la proporción se estabiliza por dilución de esos 3 tiros en cientos, no por compensación.
07 · Comprensión
Confusiones frecuentes
«Después de 5 caras, toca ceca»
Es la falacia del jugador. Cada tiro es independiente: la chance sigue siendo 50/50. Lo que se estabiliza es la proporción en miles de tiros, no el próximo tiro.
«Esta secuencia parece ordenada, no es aleatoria»
El ojo es mal juez: C C C C C y C X C X X tienen la misma probabilidad en 5 tiros justos. El azar produce rachas y «dibujos» por puro conteo de casos.
«Aleatorio significa 50/50»
No: 50/50 es solo la moneda justa. Un dado (1/6 por cara), una ruleta con 37 números o la altura de una persona son aleatorios sin ser 50/50.
«La computadora genera azar verdadero»
No: random calcula con una fórmula a partir de una semilla. Parece azar y alcanza para simular, pero si repetís la semilla repetís la secuencia. Lo veremos en el Tema 2 y a fondo en el Tema 5.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: contar caras
Generá 20 tiros (1 = cara, 0 = ceca), contalos y calculá la proporción. Ejecutalo varias veces y anotá cuánto varía.
import random
tiros = [random.randint(0, 1) for _ in range(20)]
caras = sum(tiros)
print("tiros:", tiros)
print("caras:", caras, "proporción:", caras / len(tiros))
Ver solución razonada
Con 20 tiros, proporciones entre 0,35 y 0,65 son totalmente normales. No indican moneda cargada: la muestra es chica. La veredicto serio requiere cientos o miles de tiros, como en el laboratorio.
Ejercicio 2: el 6 del dado
Sin ejecutar primero: en 6000 tiros de un dado justo, ¿cuántas veces esperás cada cara? ¿Qué frecuencia relativa esperás para el 6? Después comprobalo.
import random
tiros = [random.randint(1, 6) for _ in range(6000)]
frec6 = tiros.count(6) / len(tiros)
print("veces que salió 6:", tiros.count(6))
print("frecuencia del 6:", round(frec6, 4))
Ver solución
Esperás unas 1000 apariciones por cara y frecuencia ≈ 0,1667 para el 6. Valores entre 0,155 y 0,178 son habituales; solo desvíos grandes y repetidos sugieren dado cargado o generador defectuoso.
Ejercicio 3: la racha más larga
Escribí una función que devuelva la racha más larga de caras (unos) en una lista de tiros. Probala con 200 tiros y repetí el experimento: ¿salen rachas de 5 o más?
Ver una posible respuesta
import random
def racha_maxima(tiros, valor=1):
mejor = actual = 0
for t in tiros:
if t == valor:
actual += 1
mejor = max(mejor, actual)
else:
actual = 0
return mejor
tiros = [random.randint(0, 1) for _ in range(200)]
print(tiros)
print("racha máxima de caras:", racha_maxima(tiros))
Sí: en 200 tiros lo normal es ver rachas de 6, 7 u 8. No es un bug del generador: las rachas son parte del azar. Esta idea será clave para las pruebas de independencia (Tema 28).
09 · Síntesis
Ideas para recordar
- Aleatorio = próximo resultado impredecible + proporciones estables en muchas repeticiones.
- Resultado, espacio muestral, evento y frecuencia relativa son el vocabulario mínimo.
- Aleatorio no implica equiprobable ni alternado: las rachas son normales.
- La moneda no tiene memoria: la falacia del jugador confunde dilución con compensación.
- En Python,
random.random()yrandom.randint()generan el azar que analizaremos; por dentro hay una fórmula determinista.
En el próximo tema veremos la distinción central del curso: aleatoriedad frente a pseudoaleatoriedad, es decir, por qué tu programa puede imitar el azar sin tener azar real.