01 · Punto de partida
De la confianza a la repetición
Verificamos el programa (Tema 35), lo validamos (Tema 36), lo calibramos (Tema 37) y ordenamos escenarios y sensibilidades (Temas 39–40). Pero todo ese edificio se cae con una pregunta simple: si otro corre lo mismo, ¿obtiene lo mismo? Sin reproducibilidad no hay auditoría, no hay ciencia y no hay decisión defendible.
Reproducible no es «más o menos parecido»: es idéntico ante iguales entradas (misma versión, mismos parámetros, mismas semillas) y explicable cuando difiere (qué versión o semilla cambió y por qué).
- ¿Cada corrida guarda su semilla y su versión?
- ¿El azar sale de un generador propio, no global?
- ¿Otro puede repetir el experimento con lo guardado?
- ¿Qué cambia cuando el resultado cambia?
02 · Vocabulario mínimo
Semilla, versión y traza
Semilla
Número que fija el azar: misma semilla, misma historia. Una por corrida, nunca global.
Versión
Qué código corrió: v1, v2, commit o fecha. Sin versión, el resultado es huérfano.
Traza
Ficha completa: parámetros, semillas, versión, horizonte y estado. Viaja con cada resultado.
| Qué | Cómo se fija | Qué rompe si falta |
|---|---|---|
| Azar | random.Random(semilla) por corrida | Historias que cambian solas |
| Código | Versión o commit guardado | v1 contra v2 sin saberlo |
| Datos | Entradas y parámetros archivados | El pasado «igual» que no era igual |
| Análisis | Mismo script de agregación | Iguales corridas, distintas conclusiones |
03 · Tres pilares
Azar, código y registro
- 1Azar fijado.
Generador propio por corrida con semilla registrada. Nada de azar global ni hora del sistema.
- 2Código versionado.
Cada resultado dice qué versión lo produjo. Cambiar el modelo sin cambiar la versión es fraguar.
- 3Registro completo.
Traza junto al resultado: parámetros, semillas, versión, horizonte y estado (Tema 33).
Re-ejecutable
Corre otra vez
El script anda en tu máquina hoy. Mañana, en otra máquina o con otra versión, da otra cosa y nadie sabe por qué.
Reproducible
Da lo mismo
Con la traza guardada, otro obtiene historias idénticas y sabe exactamente qué cambiar para explorar.
- Reproducibilidad
- Iguales entradas producen iguales salidas, verificable por otro.
- Semilla
- Valor inicial del generador que fija la secuencia aleatoria.
- Versión
- Identidad del código que produjo un resultado.
- Traza
- Registro que permite repetir una corrida idéntica.
04 · Protocolo
El pacto en cinco pasos
Se fijan semillas, se versiona el código, se registra la traza con cada resultado, se comparte código + datos + trazas y otro repite idéntico antes de discutir conclusiones.
05 · En Python
Azar propio y traza que viaja
Cada corrida crea su generador: la misma semilla repite la historia en cualquier máquina y en cualquier orden.
Python en tu navegador. Reproducibilidad con stdlib: generadores propios y dicts.
import random
def corrida(entradas, salida, semilla, version="v1"):
rng = random.Random(semilla)
n, h = 10, []
for e in entradas:
n = max(n + e + rng.choice([-1, 0, 1]) - salida, 0)
h.append(n)
return {"version": version, "semilla": semilla, "historia": h}
a = corrida([3] * 6, 2, 7)
b = corrida([3] * 6, 2, 7)
print("idénticas:", a["historia"] == b["historia"])
La versión también se registra
Dos versiones del modelo con igual semilla deben poder diferir: la traza explica por qué.
r1 = corrida([3] * 6, 2, 7, version="v1")
r2 = corrida([3] * 6, 2, 7, version="v2")
print(r1["version"], r1["semilla"])
print(r2["version"], r2["semilla"])
06 · Exploración
Laboratorio: lo mismo da lo mismo
Dos corridas del mismo banco. La A siempre usa la v1. La B usa la versión que elijas, con la semilla que elijas. ¿Cuándo las historias se superponen y cuándo se separan? ¿Por azar o por versión?
A contra B
misma semilla + misma versión = idéntica
Misma semilla y misma versión: historias idénticas paso a paso.
Dos curvas: A (v1, semilla 7) y B (tu versión y semilla). Superpuestas es repetible; separadas explican por qué.
Preguntas para explorar
- Con B en v1 y semilla 7, ¿coinciden los 12 pasos? Cambiá solo la semilla de B. ¿Qué pasa?
- Volvé a semilla 7 y pasá B a v2. ¿Difieren aunque la semilla sea igual? ¿Por qué?
- Alargá a 24 pasos con todo igual. ¿Siguen idénticas? ¿Qué prueba eso sobre el azar fijado?
Ver respuestas sugeridas
- Sí, 12 de 12. Al cambiar la semilla difieren: distinto azar, distinta historia, como debe ser.
- Sí: igual semilla pero distinto modelo (v2 atiende 1 más). La traza lo explica: cambió la versión, no el azar.
- Sí: el generador propio repite la secuencia completa. El azar fijado no depende del largo ni del orden.
07 · Comprensión
Confusiones frecuentes
«Reproducible es parecido»
No: es idéntico ante iguales entradas. Parecido es re-ejecutable con suerte.
«Con guardar el código alcanza»
Faltan semillas, datos, versión y script de análisis. El código solo es un cuarto del pacto.
«La semilla es un detalle técnico»
Es parte del resultado: sin ella, la historia aleatoria no se puede repetir ni auditar.
«Versionar es para software grande»
Un «v1 / v2» escrito en la traza ya es versionar. Lo imperdonable es mezclar versiones sin saberlo.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: repetir la historia
Corré dos veces con igual semilla y verificá que las historias coinciden.
import random
def historia(semilla):
rng = random.Random(semilla)
return [rng.choice([-1, 0, 1]) for _ in range(6)]
print(historia(7) == historia(7))
Ver solución razonada
Da True: el generador propio repite la secuencia exacta. Con azar global y otro orden, podría fallar.
Ejercicio 2: distinguir por versión
Guardá versión junto a semilla y explicá una diferencia con igual semilla.
a = {"version": "v1", "semilla": 7, "media": 8.1}
b = {"version": "v2", "semilla": 7, "media": 7.4}
print("difieren por", "versión" if a["version"] != b["version"] else "azar")
Ver solución
Imprime difieren por versión: igual semilla, distinto modelo. La traza lo dice sin adivinar.
Ejercicio 3: armar la traza mínima
Empaquetá lo mínimo que otro necesita para repetir tu corrida.
Ver una posible respuesta
traza = {"version": "v1", "semilla": 7, "entradas": [3] * 6,
"salida": 2, "horizonte": 6, "estado": "OK"}
print(sorted(traza))
Con esas 6 claves otro repite idéntico: versión, semilla, entradas, salida, horizonte y estado.
09 · Síntesis
Ideas para recordar
- Reproducible es idéntico ante iguales entradas, explicable cuando difiere.
- Un generador propio por corrida con semilla registrada aísla y fija el azar.
- Cada resultado lleva su versión: sin versión no hay auditoría.
- La traza viaja con el resultado: parámetros, semillas, versión, horizonte, estado.
- En Python:
random.Random(semilla)por corrida y dicts de traza.
En el próximo tema cosecharemos lo andado: las ventajas de la simulación.