01 · Punto de partida
Nadie agenda el futuro gratis
Cada futuro del calendario nació en algún lado. La próxima llegada nace de un sorteo (“el próximo cliente viene en X minutos”); la próxima salida nace de un inicio (“si empezó ahora y dura S, termina en t+S”). Una viene de afuera (proceso de llegadas), la otra de adentro (actividad que termina).
Si el sorteo está mal —sin semilla, con distribución equivocada o encadenado roto— toda la simulación mide otro mundo. Generar bien es la mitad de simular bien.
- ¿Este futuro se sortea o se calcula?
- ¿Con qué distribución y qué media?
- ¿Quién lo agenda y en qué momento exacto?
- ¿Puedo repetir la misma secuencia mañana?
02 · Definición
Dos fábricas de futuro
Exógena (llegadas)
Sorteo de afuera: próxima = ahora + X con X de una distribución (fija o exponencial). Cada llegada agenda la siguiente: cadena infinita.
Endógena (fines)
Cálculo de adentro: fin = inicio + S al iniciar el servicio. Sin sorteo nuevo si S es fijo; con sorteo de S al iniciar si es aleatorio.
Encadenar
Cada evento agenda sus hijos: llegada → próxima llegada (+ eventual salida); salida → próxima salida del siguiente. El futuro nunca se seca por olvido.
| Futuro | Origen | Cuándo se agenda | Fórmula |
|---|---|---|---|
| Próxima llegada | Exógeno (proceso de llegadas) | Al inicializar y en cada llegada | t + X (sorteado) |
| Fin de servicio | Endógeno (actividad) | Al iniciar cada servicio | inicio + S |
| Stop / fin | Parámetro | Al inicializar | T fijo |
03 · Métodos
Fijos, exponenciales y encadenados
- 1Tiempos fijos (didácticos).
Cada A exacto: 2, 4, 6… Predecibles, ideales para validar a mano. Irreales para clientes.
- 2Exponenciales (markovianos).
X = −media·ln(1−U)con U uniforme: la “falta de memoria” de llegadas telefónicas y requests. Base de M/M/1 (Tema 31). - 3Encadenamiento.
La llegada en t agenda la de t+X inmediatamente, antes de hacer otra cosa. Si se olvida, la cadena muere y el futuro se seca.
- Semilla (seed)
- Número que inicia el generador: misma seed = misma secuencia. Se fija por réplica y se publica.
- Tasa λ y media A
A = 1/λ: llegan λ por unidad en promedio. Con A=2, λ=0.5/min. (Tema 23)- Truncado por horizonte
- Lo sorteado más allá de T se descarta (o se anota como “fuera”). No se procesa, no contamina stats.
- Sorteo al iniciar
- La S aleatoria se sortea al empezar el servicio y viaja con la entidad, nunca al terminar. (Tema 9)
Fijo
Reloj suizo
Llegadas cada 2.0 exactos: validable con lápiz, incapaz de ráfagas y silencios reales.
Exponencial
Mundo real
Ráfagas y huecos con media A: el sistema sufre picos aunque “en promedio” dé abasto.
04 · Ejemplos
Qué se sortea en cada mundo
| Sistema | Se sortea (exógeno) | Se calcula (endógeno) |
|---|---|---|
| Banco | Entre-llegadas exponencial media 2 | Fin = inicio + 3 |
| Web | Arribos por segundo (Poisson) | Fin = inicio + Exp(media 0.12 s) |
| Taller | Llegadas de piezas | Fin en A y en B con sus S |
05 · Representación en Python
Sortear, encadenar y agendar
El patrón son tres líneas en cada llegada: sortear X, agendar t+X, seguir. La exponencial sale de random.expovariate(1/media).
Python en tu navegador. El primero encadena fijas; el segundo sortea exponenciales con semilla. Cambiá la seed y mirá otra historia repetible.
import heapq, itertools
fel, seq = [], itertools.count()
A = 2.0
heapq.heappush(fel, (A, 1, next(seq), "llegada", {}))
# En cada llegada (t): heapq.heappush(fel, (t + A, 1, next(seq), "llegada", {}))
print("cadena fija:", [A, 2 * A, 3 * A])
import random
random.seed(7)
media = 2.0
t, llegadas = 0.0, []
for _ in range(5):
X = random.expovariate(1 / media) # entre-llegada exponencial
t += X
llegadas.append(round(t, 2))
print("exponenciales (seed 7):", llegadas)
06 · Exploración
Laboratorio: reloj suizo vs. mundo real
Generamos llegadas hasta t=12 con media A: en modo fijo caen cada A exactos; en exponencial se sortean con la seed elegida. Compará: mismo promedio, distinta música — ráfagas y huecos que el fijo jamás produce.
La misma media, otra historia
fijo: A, 2A… · Exp: t += −A·ln(1−U)
Cambiá a exponencial para ver ráfagas.
Tallos verdes: llegadas generadas. Con fijo son equidistantes; con exponencial se apelotonan y se separan aunque la media coincida.
Preguntas para explorar
- Con A=2 fijo, ¿cuántas llegadas hay hasta 12? ¿Y su intervalo medio?
- Pasá a exponencial (seed 7): ¿el conteo coincide? ¿Y el mín/máx?
- Cambiá la seed 7→3: ¿cambia la media mucho o poco? ¿Y la historia concreta?
Ver respuestas sugeridas
- 6 (2,4,6,8,10,12), medio exacto 2.0, mín=máx=2.0: orden perfecto.
- El conteo ronda 6 pero varía (5–7); el mín puede ser 0.3 y el máx 5: ráfagas y huecos con igual media. Esa varianza castiga las colas.
- La media apenas se mueve (ley de los grandes números en miniatura); la historia concreta sí: otras ráfagas en otros momentos. Por eso se reporta con varias seeds.
07 · Comprensión
Confusiones frecuentes
«Generar es solo las llegadas»
También son los fines (inicio+S), las fallas y el stop. Todo futuro nace de algún generador explícito.
«Exponencial es solo otra campana»
La exponencial es asimétrica y sin memoria: muchos intervalos cortos y pocos larguísimos. La campana (normal) es simétrica y puede dar tiempos negativos si se usa mal.
«La seed da igual si promedio muchas»
Sin seed no podés repetir el caso que falló ni publicar resultados auditables. Promediar no sustituye reproducir.
«Agendar la siguiente puede esperar al final»
Si la rutina falla antes de agendar, la cadena muere. Se agenda primero, se atiende después.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: cadena fija
Generá llegadas cada 2 hasta 8 encadenando.
t, A, T, lista = 0.0, 2.0, 8.0, []
t += A
while t <= T:
lista.append(t)
t += A # cada una agenda la siguiente
print(lista) # [2.0, 4.0, 6.0, 8.0]
Ver solución razonada
El t += A dentro del bucle es el encadenamiento: cada llegada engendra la próxima. Fuera del bucle, la cadena no existe.
Ejercicio 2: primera exponencial
Sorteá 3 entre-llegadas de media 2 con seed 7 y acumulalas.
import random
random.seed(7)
t = 0.0
for _ in range(3):
t += random.expovariate(1 / 2.0)
print(round(t, 2))
Ver solución
Tiempos irregulares pero repetibles con seed 7: otra seed, otra historia; misma seed, misma historia siempre.
Ejercicio 3: fin endógeno
Inicio en 10 con S sorteada de media 3 (seed 1): ¿fin?
Ver una posible respuesta
import random
random.seed(1)
S = random.expovariate(1 / 3)
print("S =", round(S, 2), "| fin =", round(10 + S, 2))
S se sortea al iniciar y el fin queda fijado: el futuro endógeno nace calculado, no adivinado.
09 · Síntesis
Ideas para recordar
- Llegadas (exógenas) se sortean y encadenan: cada una agenda la siguiente.
- Fines (endógenos) se calculan al iniciar:
fin = inicio + S. - Fijo para validar a mano; exponencial para mundo real (media A, tasa λ=1/A).
- Semilla por réplica: sin ella no hay depuración ni publicación.
- Agendar primero, atender después: la cadena no debe cortarse.
En el próximo tema veremos el procesamiento de eventos: qué hace cada rutina al recibir su evento.