Números Pseudoaleatorios · Tema 01

Aleatoriedad

Qué significa que algo sea aleatorio, por qué el próximo resultado es impredecible aunque el conjunto sea regular, y cómo empezar a generarlo con Python.

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.

Distinguir lo aleatorio de lo determinista.
Fenómeno¿Próximo resultado?¿Miles de repeticiones?
Tirar un dado equilibradoImpredecible (1 a 6)Cada cara ~16,7 %
Calcular 2 + 2Siempre 4Siempre 4
Tiempo entre clientesImpredeciblePromedio y distribución estables
Contar de 1 en 1Totalmente predecibleSecuencia 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:

Fuente de azar→Observación→Secuencia de valores
  1. 1
    Moneda.

    Resultados: cara o ceca. Evento típico: proporción de caras en 1000 tiros. Base de todo test de uniformidad.

  2. 2
    Dado.

    Resultados: 1 a 6. Evento típico: ¿sale un 6? ¿sale par? Primer ejemplo de enteros aleatorios.

  3. 3
    Sorteo y loot (botín/recompensas del juego).

    Resultados: ítems con distinta rareza. Evento típico: elegir un ganador o un objeto con probabilidad ponderada.

  4. 4
    Llegadas.

    Resultados: segundos entre clientes o paquetes. Evento típico: cuántos llegan en una hora pico.

  5. 5
    Medició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.

EXPERIMENTO 01

Proporción de caras según N

p(n) = caras / n → 0,5

Los resultados numéricos aparecen debajo.
Caras—
Cruces—
Proporción de caras—
Distancia a 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

  1. Con N = 10, lanzá 5 veces. ¿La proporción final varía mucho entre intentos? ¿Y con N = 2000?
  2. ¿Alguna secuencia tuvo 4 o 5 caras seguidas al inicio? ¿Eso contradice que la moneda sea justa?
  3. Si después de 3 caras seguidas alguien dice «ya toca ceca», ¿qué le respondés con este gráfico?
Ver respuestas sugeridas
  1. 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.
  2. No: las rachas cortas son esperables. En 500 tiros es raro no ver rachas de 5 o 6. El azar no alterna prolijamente.
  3. 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() y random.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.