Problema:
Tiene un numero limitado de opciones que quiere que aparescan al azar (A,B,C,D,E). Sin embargo quiere forzar la probabilidad de aparición de cada una de las mismas. Por ejemplo desea que la A aparesca el 50% de las veces, la B, C y D desea que aparescan un 10% de las veces y la E que aparesca un 20% de las veces. Sin que sea posible determinar con certeza que letra va a aparecer.
Desarrolle un código que permita establecer la probabilidad de aparición de cada item de la lista.
Solución:
Vamos a asumir que tenemos un casillero con 10 posiciones.
Vamos a asumir también que estos casilleros se abren uno a la vez de manera aleatoria, es decir no podemos saber que casillero se va a abrir.
Vamos a asumir que dentro de cada casillero hay un cartón con una letra pintada encima. Las letras son A, B, C, D y E.
Si yo quiero, que la probabilidad de que aparesca una A, al abrir el casillero sea del 50%, entonces debo asegurarme que de los 10 casilleros 5 tengan dentro de sí la letra A.
Visto de forma numérica la cantidad de los cartones correspondería a la siguiente:
5 de 10 cartones pintados con la A
1 de 10 cartones pintados con la B
1 de 10 cartones pintados con la C
1 de 10 cartones pintados con la D
2 de 10 cartones pintados con la E
En total tenemos 10 cartones que repartiremos dentro de los 10 casilleros. El orden en que los repartamos no importa ya que como el casillero se abre al azar habremos establecido la probabilidad de aparición de cada letra.
¿Como haremos esto en código?Primero, necesitamos establecer una lista que contenga los elementos que queremos junto con su probabilidad de aparición. Esto lo podemos hacer en javascript creando un array de objetos que contengan el valor con su respectiva probabilidad:
var cartones =
Array(
{ valor:"A", probabilidad: (5/10) },
{ valor:"B", probabilidad: (1/10) },
{ valor:"C", probabilidad: (1/10) },
{ valor:"D", probabilidad: (1/10) },
{ valor:"E", probabilidad: (2/10) }
);
Antes de continuar es muy importante aclarar que las probabilidades en total tienen que sumar 100%. No puede ser ni más ni menos, aquí tenemos que tener cuidado en ajustar las probabilidades de manera acorde a como nosotros querramos.
Lo segundo es un poco más sencillo pero un poco difícil de explicar....
La funcion Math.random(), nos devuelve un valor pseudo aleatorio entre 0 y 1. Si leen la analogía de los casilleros nosotros tenemos que asignar los espacios correspondientes a la probabilidad.
Si tuvieramos que verificar este "casillero" con if el codigo para seleccionar al azar nos quedaría algo así:
function obtenerLetra() {
var random = Math.random();
if(random>0 && random<(5/10)) {
return "A"; // Devuelve A si random entre 0 y 0.5
} else if(random>(5/10) && random<( 5/10 + 1/10 )) {
return "B"; // Devuelve B si random entre 0.5 y 0.6
} else if(random>( 5/10 + 1/10 ) && random<( 5/10 + 1/10 + 1/10 )) {
return "C"; // Devuelve C si random entre 0.6 y 0.7
} else if(random>( 5/10 + 1/10 + 1/10 ) && random<( 5/10 + 1/10 + 1/10 + 1/10 )) {
return "D"; // Devuelve D si random entre 0.7 y 0.8
} else if(random>( 5/10 + 1/10 + 1/10 + 1/10 ) && random<(5/10 + 1/10 + 1/10 + 1/10 + 2/10)) {
return "E"; // Devuelve E si random entre 0.8 y 1.0
} else if
}
Pero mx.. preguntaran algunos. ¿Porqué los casilleros se llenan en el orden de las letras?
Respuesta: Realmente aquí el orden no importa, asumimos que el numero devuelto por Math.random(), es lo suficientemente aleatorio, es decir cualqueir valor entre 0 y 1 tiene la misma probabilidad de aparecer.
Al hacer la seleccion de valores por rangos lo que estamos haciendo es aumentando la probabilidad de una opción especifica de aparecer. Sin embargo la letra que aparece siempre es aleatoria ya que en teoría no tenemos forma de determinar que letra aparecerá, únicamente podemos saber la probabilidad de que aparesca.
Un uso interesante para esta funcion es por ejemplo, en un juego de tragaperras que querramos que el usuario solo gane un 10% de las veces.
Si lo quieren como funcion, el código sería algo así.
function obtenerLetraProbabilidad() {
var random = Math.random();
var base=0;
for(var i=0;i<items.length;i++) {
if(random>=base && random<(base+items[i].probabilidad)) {
return items[i].valor; // devuelve valor si esta dentro del rango especificado
} else {
base += items[i].probabilidad;
}
}
}
P.D.: Ya ven que sirven de algo las clases de estadística en la U fksjad lfja hfkjfdasda