Un Amigo me Pregunto , Acerca de crear una funcion Capaz de Elegir un Numero entre una Lista de Numeros, pero cada Numero tiene una Probabilidad de Exito.
Me explico, si tengo el numero 1 y 2 , pero 1 tiene una probabilidad de 90% y 2 solo de 10%, entonces una funcion que me entrege de forma aleatoria el suceso
pero respetando la
probabilidad de exito
Pensandolo un poco, llege a la siguiente funcion
Código PHP:
<?
// Numeros con Probabilidad de Exito
// by DeeR http://deerme.org
function sum_array($m)
{
$t=0;
foreach($m as $v)
{
$t=($t+$v);
}
return $t;
}
function num_con_prob($n,$p)
{
// Las Matrices deben ser de Igual Dimension
if ( count($n) == count($p) )
{
// La Suma de la Matriz $p debe dar 100 (Suma de Probabilidades)
if ( sum_array($p) == 100 )
{
// Recorremos los Numeros
$m=0;
for ( $i=0 ; $i<count($n) ; $i++ )
{
// Recorremos sus Probabilidades
for ( $j=0 ; $j<($p[$i]) ; $j++)
{
$prob[$m]=$n[$i];
$m++;
}
}
/*
Finalmente Tenemos en la Matris $prob Los Numeros repetidos segun
su Probabilidad
Entonces ahora elegimos un Numero al Azar de la Matriz $prob
- Cada Numero tiene su Probabilidad de Salir (La cantidad de Veces que se repite, es ovbio, si se repite mas veces en la matriz, es mas probable que salga elegido).
*/
return ( $prob[ rand(0,99) ] );
}
}
return FALSE;
}
$numeros=array(1,2,3,4,5);
$probabilidades=array(15,23,35,5,22);
echo num_con_prob($numeros,$probabilidades);
?>
Entonces lo que le entregamos a la funcion, primero es un array con todos los numeros posibles, luego le entregamos un array con la probabilidad de cada numero, luego la funcion corrobora que sea de la misma dimension y las probabilidades sumen 100, luego cada numero es guardado la cantidad de veces su porcentaje en un array. Finalmente utilizamos rand para selecionar alguna posicion del array (recordemos que rand , es al azar , es decir, cada numero tiene la misma probabilidad de salir).
Entonces si aplicamos
Código PHP:
<?
$numeros=array(1,2);
$probabilidades=array(90,10);
echo num_con_prob($numeros,$probabilidades);
?>
Podemos ver que es muxo mas probable que salga el 1
La mayor Limitacion de la funcion, Es que las Probabilidades deben ser enteras (sin Decimales). Supongamos el caso
1 tiene P(1)=%56,35
2 tiene P(2)=%43,65
Con este caso, la funcion no seria capaz de solucionarlo (a menos que redondiemos a entero los porcentajes :P).
Bueno me gustaria ver,
¿ Si algun Amigo del Foro Tiene alguna otra solucion al problema ? o Vamos mejorando la actual :P