Llegará un momento en tu vida cuando no quieras una distribución uniforme de valores aleatorios, o una gaussiana. Imaginemos por un momento que eres un caminante aleatorio en busca de alimento. Moverte aleatoriamente en un espacio parece ser una estrategia razonable para encontrar algo para comer. Después de todo, no sabes dónde está la comida, así que bien puedes buscar aleatoriamente hasta encontrarla. El problema, como podrás haber notado, es que los caminantes aleatorios regresan a lugares previamente visitados muchas veces (esto se conoce como “sobremuestreo”, “oversampling” en inglés). Una estrategia para evitar este problema es, cada cierto tiempo, dar un paso muy grande. Esto permite que el caminante busque aleatoriamente alrededor de una ubicación específica mientras que periódicamente salta muy lejos para reducir la cantidad de sobremuestreo. Esta variación de la caminata aleatoria (conocida como un vuelo de Lévy) requiere un conjunto personalizado de probabilidades. Aunque no es una implementación exacta de un vuelo de Lévy, podríamos formular la distribución de probabilidad como sigue: mientras más largo el paso, es menor la probabilidad de ser elegido; mientras más corto el paso, es mayor la probabilidad.
Anteriormente en esta sección, vimos que podríamos generar distribuciones de probabilidad personalizadas rellenando un arreglo con valores (algunos duplicados para que fueran escogidos con mayor frecuencia) o probando el resultado de random(). Podríamos implementar un vuelo de Lévy diciendo que hay una probabilidad del 1% de que el caminante tome un paso largo.
var r = random(1);
// A 1% chance of taking a large step
if (r < 0.01) {
  xstep = random(-100, 100);
  ystep = random(-100, 100);
} else {
  xstep = random(-1, 1);
  ystep = random(-1, 1);
}
Sin embargo, esto reduce las probabilidades a un número fijo de opciones. ¿Qué pasa si queremos hacer una regla más general; mientras más grande sea el número, más probabilidad tiene de ser elegido? 3.145 sería más probable de ser elegido que 3.144, incluso si esa probabilidad es solo un poquito mayor. En otras palabras, si x es el número aleatorio, podríamos mapear la probabilidad en el eje y con y = x.
Imagen de la Naturaleza del Código
Figura I.4
Si podemos averiguar cómo generar una distribución de números aleatorios de acuerdo con la gráfica anterior, entonces seremos capaces de aplicar la misma metodología para cualquier curva para la cual tengamos una fórmula.
Una solución es elegir dos números aleatorios en vez de uno. El primer número aleatorio es solo eso, un número aleatorio. El segundo, sin embargo, es lo que llamaremos un “valor aleatorio calificador”. Nos dirá si utilizamos el primero o lo desechamos y escogemos otro. Los números para los que es más fácil sacar buena calificación serán escogidos más a menudo, y los números que rara vez reúnen los requisitos serán escogidos con menor frecuencia. Estos son los pasos (por ahora, vamos a considerar solo valores aleatorios entre 0 y 1):
  1. Escoge un número aleatorio: R1
  2. Calcula una probabilidad P de que R1 califique. Probemos: P = R1.
  3. Escoge otro número aleatorio: R2
  4. Si R2 es menor que P, entonces ya encontramos nuestro número: ¡R1!
  5. Si R2 no es menor que P, regresa al paso 1 y vuelve a empezar.
Aquí estamos diciendo que la probabilidad de que un valor aleatorio califique es igual al propio número aleatorio. Supongamos que escogemos 0.1 para R1. Esto significa que R1 tendrá una probabilidad del 10% de calificar. Si escogemos 0.83 para R1 entonces tendrá un 83% de probabilidad de calificar. Mientras más grande sea el número, mayor será la probabilidad de que en realidad lo usemos.
Aquí hay una función (llamada así por el método de Monte Carlo, que a su vez lleva el nombre del casino Monte Carlo) que implementa el algoritmo anterior, regresando un valor aleatorio entre 0 y 1. Este programa utiliza los valores para el tamaño de las elipses, pero podríamos utilizar esos valores para muchas cosas.

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.