A través de un ejemplo vamos a ilustrar los pasos necesarios para construir un modelo de simulación en Java, partiendo de una simulación manual.
Imagine que se diseña una lotería instantánea, donde una tarjeta tiene tres filas. En cada fila hay dos casillas con los valores ocultos de $1 y $5. El jugador raspa solo una de las dos casillas de cada fila. Si descubre tres números iguales gana esa cantidad. ¿Cuál es la mínima cantidad que se debe cobrar por cada tarjeta si se desea tener ganancias?
Es decir, la siguiente tarjeta ganaría $1.
La siguiente tarjeta ganaría $5.
Y la siguiente tarjeta no ganaría nada:
La ganancia esperada viene dada por la siguiente fórmula:
Ganancia esperada = ($1 * probabilidad de ganar $1) + ($5 * probabilidad de ganar $5)
La probabilidad de ganar $1 = (1/2) * (1/2) * (1/2) = 1/8
La probabilidad de ganar $5 = (1/2) * (1/2) * (1/2) = 1/8
Ganancia esperada = 1 * (1/8) + 5 * (1/8) = $0.75
Al cobrar $ 0.75 por tarjeta los organizadores no pierden ni ganan dinero. (Con esa información los organizadores podrían decidir cuánta ganancia les gustaría obtener, sin llegar a fijar un precio demasiado elevado).
Ahora bien, se puede utilizar Simulación para obtener un resultado similar. En este ejemplo podríamos seguir varias opciones.
Se tendrían que imprimir una buena cantidad de tarjetas y hacer pruebas. Con este proceso obtendríamos una estimación de la ganancia esperada, pero tiene el inconveniente de tener que imprimir una gran cantidad de tarjetas solo para hacer el experimento, lo que implica gastos de dinero y tiempo.
El juego se podría simular por analogía, lanzando una moneda al aire para simular el raspado de una casilla. Si cae “cara” es como si saliera el “1”, y si cae “cruz” es como si saliera el “5”. Se lanza la moneda al aire tres veces y se registra la ganancia del juego: $1 si los tres lanzamientos son cara, $5 si los tres lanzamientos son cruces y $0 de otra forma. Se tendrían que hacer varios intentos, sumar las ganancias de todos los intentos y dividirlos entre el número de intentos para obtener una estimación de la ganancia esperada del juego.
Aunque se ha eliminado la impresión física de tarjetas, el método anterior aun es trabajoso. Por lo que se puede usar una computadora para “lanzar” la moneda, tabular los resultados y efectuar el cálculo necesario.
En un programa de computadora, el lanzamiento de la moneda se puede simular usando números aleatorios para representar el resultado del lanzamiento. Se generarían tres números aleatorios entre 0 y 1. Se registra la ganancia del juego: $5 si los tres números son mayores que 0.5 (tres cruces), $1 si los tres son menores, y $0 de otra manera.
La computadora puede programarse para sumar las ganancias y dividir el total para obtener una estimación de la ganancia esperada.
La simulación por computadora nos evita la impresión de las tarjetas y el esfuerzo manual de hacer los cálculos, pero más que eso, una vez realizado el programa, podemos modificarlo para que corra 100, 1000 o 100 000 veces si se quisiera y así tener resultados más exactos.
public static void main(String[] args) { double aleatorio =0; int i,j; int max=100; int cant5, cant1; int ganancia=0; double promedio=0; for (i=1; i<=max; i++){ cant5 = cant1 = 0; System.out.print ("Tarjeta " + i + "\t"); for (j=0; j<3; j++){ // Simular el lanzamiento de moneda. aleatorio = Math.random(); // Si el número aleatorio es mayor a 0.5 raspó $5 if (aleatorio > 0.5){ System.out.print ("5 \t"); cant5++; } else{ System.out.print ("1 \t"); cant1++; } } // Si obtiene 3 números iguales gana esa cantidad if (cant5 == 3){ System.out.print("Gana $5"); ganancia+=5; } if (cant1 == 3){ System.out.print("Gana $1"); ganancia+=1; } System.out.print("\n"); } // Mostramos ganancia promedio por tarjeta promedio = ganancia/(double)max; System.out.print("Ganancia promedio: " + promedio); }
En esta ejecución se realizaron 100 simulaciones, en la imagen solamente vemos las últimas. Al realizar el cálculo de la ganancia promedio obtenemos 0.73 (en otras ejecuciones puede obtenerse resultados ligeramente diferentes), lo que es muy cercano al cálculo obtenido por teoría de las probabilidades.
En este artículo vimos como simular una actividad del mundo real que depende de datos aleatorios. No siempre podremos obtener resultados utilizando cálculos matemáticos pues en ocasiones éstos serán muy complejos. Tampoco se puede realizar simulaciones manuales o literales pues el costo económico o de tiempo podría llegar a ser elevado. En estos casos, la simulación por computadora utilizando modelos propios es relativamente sencilla y proporciona resultados confiables.