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 si aplicamos
Código PHP:
<?
$numeros=array(1,2);
$probabilidades=array(90,10);
echo num_con_prob($numeros,$probabilidades);
?>
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