¿Recuerdas cuando empezaste a programar aquí? Tal vez querías dibujar muchos círculos en la pantalla. Así que te dijiste a ti mismo: “Oh, ya sé. Voy a dibujar todos estos círculos en posiciones aleatorias, con tamaños aleatorios y colores aleatorios”. En un sistema de gráficas de computadora, a menudo es más fácil iniciar un sistema con aleatoriedad. Sin embargo, en estas lecciones, buscamos construir sistemas modelados con lo que vemos en la naturaleza. Usar aleatoriedad de manera predeterminada no es una solución particularmente buena a un problema de diseño: en particular el tipo de problema que involucra crear una simulación orgánica o de aspecto natural.
Con algunos trucos, podemos cambiar la forma en que utilizamos random() para producir distribuciones “no uniformes” de números aleatorios. Esto será muy útil a lo largo de este curso a medida que vayamos viendo un número de escenarios diferentes. Cuando examinemos algoritmos genéticos, por ejemplo, vamos a necesitar una metodología para realizar la “selección”: ¿cuáles miembros de nuestra población deben seleccionarse para pasar su ADN a la próxima generación? ¿Recuerdas el concepto de supervivencia del más apto? Digamos que tenemos una población de monos que evolucionan. No todos los monos tendrán una oportunidad igual de reproducirse. Para simular la evolución darwiniana, no podemos simplemente escoger dos monos al azar para que sean padres. Necesitamos que los más “aptos” sean más probables de ser elegidos. Necesitamos definir la “probabilidad del más apto”. Por ejemplo, un mono particularmente rápido y fuerte podría tener un 90% de probabilidad de procrear, mientras que uno más débil tiene solo un 10% de probabilidad.
Vamos a hacer una pausa aquí y echar un vistazo a los principios básicos de la probabilidad. Primero analizaremos la probabilidad de un evento, es decir, la probabilidad de que ocurra un evento determinado.
Si tienes un sistema con un cierto número de resultados posibles, la probabilidad de que ocurra un evento determinado es igual al número de resultados que califican como ese evento dividido entre el número total de todos los resultados posibles. Lanzar una moneda es un ejemplo sencillo: tiene solo dos resultados posibles, águila o sol. Hay solo una manera de que salga águila. La probabilidad de que caiga águila, por lo tanto, es uno dividido entre dos: 1/2 o 50%.
Toma una baraja de 52 cartas. La probabilidad de sacar un as de la baraja es:
número de ases / número de cartas = 4 / 52 = 0.077 = ~ 8%
La probabilidad de sacar un diamante es:
número de diamantes / número de cartas = 13 / 52 = 0.25 = 25%
También podemos calcular la probabilidad de que varios eventos ocurran en secuencia. Para hacer esto, simplemente multiplicamos las probabilidades individuales de cada evento.
La probabilidad de que una moneda caiga águila tres veces seguidas:
(1/2) * (1/2) * (1/2) = 1/8 (o 0.125)
…lo que significa que una moneda va a caer águila tres veces seguidas una de cada ocho veces (cada “vez” son tres lanzamientos).
¿Quieres repasar probabilidad antes de continuar? Estudia eventos compuestos y probabilidad dependiente.
Hay un par de maneras en que podemos utilizar la función random() con probabilidad dentro del código. Una técnica es llenar un arreglo con una selección de números, algunos de los cuales se repiten, luego elegir números aleatorios de ese arreglo y generar eventos basados en esas selecciones.
Ejecutar este código producirá un 40% de probabilidad de imprimir el valor 1, un 20% de probabilidad de imprimir 2 y un 40% de probabilidad de imprimir 3.
También podemos pedir un número aleatorio (vamos a hacerlo simple y solo considera valores decimales aleatorios entre 0 y 1) y permitir que un evento ocurra solamente si nuestro número aleatorio está dentro de cierto rango. Revisa el siguiente ejemplo y sigue haciendo clic en reiniciar hasta que el número aleatorio escogido finalmente sea menor que el umbral:
Este método también puede aplicarse a múltiples resultados. Digamos que el Resultado A tiene un 60% de probabilidad de ocurrir, el Resultado B, un 10% de probabilidad y el Resultado C, un 30% de probabilidad. Implementamos esto en el código al escoger un número aleatorio y viendo en qué rango cae.
  • entre 0.00 y 0.60 (60%) –> Resultado A
  • entre 0.60 y 0.70 (10%) –> Resultado B
  • entre 0.70 y 1.00 (30%) –> Resultado C​__
Click the restart button to see how often you get different outcomes:
Podríamos usar la metodología anterior para crear un caminante aleatorio que tienda a moverse hacia la derecha. Aquí está un ejemplo de un Walker con las siguientes probabilidades:
  • probabilidad de moverse hacia arriba : 20%
  • probabilidad de moverse hacia abajo : 20%
  • probabilidad de moverse hacia la izquierda: 20%
  • probabilidad de moverse hacia la derecha: 40%

Este curso de "Simulaciones Naturales" es un derivado de "La Naturaleza del Código" por Daniel Shiffman, usado bajo una Licencia Creative Commons Reconocimiento-NoComercial 3.0 Unported.