If you're seeing this message, it means we're having trouble loading external resources on our website.

Si estás detrás de un filtro de páginas web, por favor asegúrate de que los dominios *.kastatic.org y *.kasandbox.org estén desbloqueados.

Contenido principal

Programar una simulación simple

¿Has oído alguna vez la fábula sobre la tortuga y la liebre?
Una liebre se burla de una tortuga por ser tan lenta y la desafía a una carrera. La liebre toma rápidamente la delantera en la carrera, pero ve que está tan adelante, que decide tomar una siesta. La liebre se despierta y descubre que la tortuga, lenta pero segura, la ha rebasado. ¡ 🐢> 🐇 !
Una ilustración de una tortuga pasando a una liebre dormida en los arbustos.
Ilustración de un libro para niños. Fuente de la imagen: Project Gutenberg
La fábula ha inspirado a la gente a hacer carreras reales entre tortugas y liebres. No tengo ninguno de estos animales a la mano, pero tengo curiosidad de saber si es verdaderamente posible: ¿puede una tortuga ganarle a una liebre somnolienta? Qué tan rápida debe ser la tortuga y que tan somnolienta la liebre?
Investiguemos estas preguntas programando una simulación:

Comenzar simple

Empecemos por simular una carrera entre una tortuga y una liebre que no toma siestas. Creo que ya sabemos los resultados de esa carrera, pero cuando programamos, ayuda iniciar con un problema más simple y después agregarle complejidad.
Primero tenemos que establecer algunas condiciones iniciales:
  • La longitud de la carrera
  • La velocidad promedio de la tortuga
  • La velocidad promedio de la liebre
También necesitamos hacer seguimiento de algunos valores que cambian durante la carrera:
  • La posición actual de la tortuga
  • La posición actual de la liebre
Podemos almacenar en variables tanto las condiciones iniciales como los valores que cambian.
Este es código JavaScript que inicializa esas variables:
var tortoiseSpeed = 1;
var hareSpeed = 2;
var raceDistance = 350;

var tortoisePos = 0;
var harePos = 0;
Luego podemos usar un bucle que actualiza la posición de la tortuga y de la liebre y termina cuando una de ellas llega a la meta final.
while (tortoisePos < raceDistance && harePos < raceDistance) {
    tortoisePos += tortoiseSpeed;
    harePos += hareSpeed;
}
Esta es la simulación al ejecutar ese código:
📝 Mira código similar en: App Lab | Snap | Python
Mientras la liebre sea más rápida que la tortuga, ganará la carrera. Ahora que eso funciona, es hora de hacerlo más interesante.

Agregar complejidad

Nuestra simulación necesita modelar el comportamiento de una liebre perezosa. Podemos empezar por establecer algunas propiedades iniciales sobre su pereza:
  • ¿Cuánto tiempo está normalmente despierta entre siestas?
  • Cuando hace siesta, ¿cuánto tiempo duerme?
Este es código JavaScript que almacena esas propiedades como variables:
var minsBetweenNaps = 30; 
var napLength = 20;
Para averiguar cuándo detener a la liebre para una siesta, también tenemos que hacer seguimiento de algunos valores:
  • ¿Cuánto tiempo ha transcurrido desde la última siesta?
  • Si está durmiendo, ¿cuánto tiempo ha durado la siesta?
Este código almacena valores iniciales para esas variables:
var minsSinceLastNap = 0;
var minsSinceNapStart = 0;
La liebre comienza despierta y corriendo, así que ambas variables inician en 0.
Por último, tenemos que agregar lógica dentro del bucle para hacer que la liebre tome siestas.
Si la liebre todavía no necesita una siesta, el código actualiza la posición de la liebre (como antes) e incrementa minsSinceLastNap:
if (minsSinceLastNap <= minsBetweenNaps) {
    harePos += hareSpeed;
    minsSinceLastNap++;
}
Si la liebre debe estar en siesta, el código incrementa minsSinceNapStart, y cuando termina la siesta, el código reasigna minsSinceLastNap y minsSinceNapStart a 0:
else {
     if (minsSinceNapStart < napLength) {
          minsSinceNapStart++;
      } else {
          minsSinceLastNap = 0;
          minsSinceNapStart = 0;
      }
}
Revisa el código ya todo ensamblado en la siguiente simulación. ¿Cuál corredor gana? ¿Cómo podrías cambiar los parámetros para que más bien gane el otro competidor?
📝 Mira código similar en: App Lab | Snap | Python

Visualizar los cambios

Una simulación no tiene que tener una salida visual; puede simplemente tener una salida textual o numérica como las simulaciones anteriores. Sin embargo, una visualización puede ayudar al usuario a tener una comprensión más intuitiva de la salida.
La manera de agregar un componente visual a una simulación de computadora depende del lenguaje que usemos y que bibliotecas tenemos disponibles. En el entorno de codificación de Khan Academy, podemos usar la biblioteca ProcessingJS para dibujar y animar formas en la pantalla, así que es perfecta para visualizar esta simulación.
Esta simulación ejecuta la misma lógica que antes, pero le agrega una visualización:
📝 Ver código similar en: App Lab | Snap | Python

Añadir variabilidad

El mundo real está lleno de variación. Tanto tortugas como liebres tienen variaciones en su velocidad; la tortuga más lenta se mueve a 0.3 km/h mientras que la más rápida se mueve a 5 km/h. Además, durante la carrera, la tortuga y la liebre no se mueven exactamente a la misma velocidad todo el tiempo; tendrán momentos rápidos y momentos lentos.
Una forma de agregar variación a una simulación es generar números aleatorios. Podemos encontrar el rango esperado de un valor en el mundo real y generar valores dentro de esos rangos.
Intenta encontrar todos los lugares que usaan números generados aleatoriamente en esta versión de la simulación, y luego reinicia para ver qué cambia:
📝 Ver código similar en: App Lab | Snap | Python
Ten en cuenta que esta simulación usa números más realistas para la velocidad del liebre comparada con la de la tortuga, así que te sorprenderán los resultados. Juega con los parámetros de la siesta para ver si puedes darle a la tortuga una oportunidad de ganar la carrera.

¿Qué está excluido?

Esta simulación es una abstracción de un escenario del mundo real. Intenta incluir los parámetros más significativos del escenario, pero no puede incluirlos todos.
Estas son algunas ideas de detalles excluidos que podrían afectar la carrera:
  • Si cada competidor se mueve en línea recta o serpentea
  • Si cada competidor tiene las calorías necesarias para continuar la carrera
  • Si cada competidor corre el riesgo de sobrecalentarse durante la carrera
🤔 ¿Qué más falta en la simulación? ¿Cómo podría la simulación ser más realista? ¿Qué parámetros nos permitirían investigar más posibilidades?

🙋🏽🙋🏻‍♀️🙋🏿‍♂️¿TIenes alguna pregunta sobre este tema? ¡Nos encantaría responderte; tan solo pregunta en el área de preguntas más abajo!

¿Quieres unirte a la conversación?

Sin publicaciones aún.
¿Sabes inglés? Haz clic aquí para ver más discusiones en el sitio en inglés de Khan Academy.