Every time it moves, this robot either hops exactly one dot to the left or one dot to the right.
If the robot starts in the center of this pattern, what is the probability that, after four hops, it’s positioned on top of a blue dot?
Cada vez que se mueve, este robot salta exactamente un punto a la izquierda o un punto a la derecha.
Si el robot comienza en el centro de este patrón, ¿cuál es la probabilidad de que, después de cuatro saltos, se posicione encima de un punto azul?
Para calcular la probabilidad de terminar en los puntos azules, vamos a ejecutar el método Montecarlo mediante la probabilidad sobre el total de resultados. Kotlin es el lenguaje elegido.
fun robotPosition():String { var results = mutableListOf() val n = 10000 (0..n).forEach { _ -> var finalPosition = 0 (0..3).forEach { _ -> finalPosition += if (Random.nextBoolean()) -1 else 1 } results.add(abs(finalPosition)) } return "Probability: ${results.count { k-> k == 2 } / n.toDouble() }" }
en la función obtenemos una muestra de 10000, simulamos 4 movimientos aleatorios y guardamos la posición. Yo le he dado el valor de 0 a la posición de partida, valores negativos por la izquierda y valores positivos por la derecha, pero a la hora de guardar como ambas partes son simétricas, guardo el valor absoluto para simplificar. Una vez ejecutado obtenemos que la probabilidad aproximada de que el robot caiga en la bola azul es de 1/2 o 0.5.
El número de iteraciones que he usado ha sido 10000, suficiente aunque lo suyo hubiera sido estudiar el promedio y la varianza para determinar que el valor es acertado.
El siguiente consigue el mismo efecto, pero esta vez acumulo las probabilidades obtenidas en un lista para así al final obtener el promedio. Ejecutamos 100 veces el movimiento del robot y obtenemos la probabilidad la cual guardamos en una lista. ejecutamos esto otras 100 veces para obtener 100 probabilidades distintas, obtenemos la media y resultado igual.
fun probabilityAverage(): String{ // montecarlo method var probTotal = mutableListOf() val n = 100 (0..n).forEach { _ -> var successful = 0.0 (0..n).forEach { _ -> var position = 0 (0..3).forEach { _ -> position += if (Random.nextBoolean()) -1 else 1 } successful += if (abs(position)==2) 1 else 0 } probTotal.add(successful / n.toDouble()) } return "Probability: ${probTotal.average()}" }