Ver Mensaje Individual
  #1 (permalink)  
Antiguo 06/03/2007, 21:39
Avatar de DeeR
DeeR
 
Fecha de Ingreso: diciembre-2003
Ubicación: Santiago
Mensajes: 520
Antigüedad: 21 años, 3 meses
Puntos: 17
Numeros con Probab de Exito

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=$i<count($n) ; $i++ )
             {
                  
// Recorremos sus Probabilidades
                
for ( $j=$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 ( $probrand(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