Puede que tengas razon, pero creo que tengo un sistema bastante bueno y agil.
Para que veais como es, voy a postearlo acontinuacion para que lo veais:
Código PHP:
$as = $_POST[hor_lun];
//////////////////////////////////DISTRIBUIMOS LAS MATERIAS DEL LUNES/////////////////////////
$ale_cad=0;
$amat = $mat;
for($i=1; $i<=$as; $i++)
{
$ale = mt_rand(1,$mat);
if( $ale == $mat )
{
$mat = $mat - 1;
}
$bus = substr_count($ale_cad, $ale);
while ( $bus != 0 || $h[$ale] == 0)
{
$ale_cad = $ale_cad.$ale;
$ale = mt_rand(1,$mat);
if( $ale == $mat )
{
$mat = $mat - 1;
}
$bus = substr_count($ale_cad, $ale);
}
$mat = $amat;
$ale_cad = $ale_cad.$ale;
$h[$ale] = $h[$ale] - 1;
Os explico por partes que hace cada cosa:
Código PHP:
$as = $_POST[hor_lun];
//////////////////////////////////DISTRIBUIMOS LAS MATERIAS DEL LUNES/////////////////////////
$ale_cad=0;
$amat = $mat;
Al principio declaramos las variables, $as, es un numero de asignaturas que tiene cad dia, en este caso el lunes. $ale_cad, es la cadena en la que se van almacenando los valores que ya hemos usado o que no sirven como validos. Y finalmente $amat, es el valor por defecto de $mat, que originalmente es un valor del numero de asignaturas totales.
Luego iniciamos un bucle del que saldran tantas asignaturas como asignaturas tiene asignadas el dia.
Código PHP:
$ale = mt_rand(1,$mat);
if( $ale == $mat )
{
$mat = $mat - 1;
}
$bus = substr_count($ale_cad, $ale);
Aqui vemos como $ale toma forma de un numero del 1 asta las materias que hayan, normalmente 11 o 12. Luego comprobamos si el numero aleatorio es igual al ultimo numero , con lo que si es asi, nos lo quitamos de enciam restandole 1 para reducir los numeros aleatorios. Al final buscamos el numero aleatorio en la cadena para ver si ya ha sido usado.
Código PHP:
while ( $bus != 0 || $h[$ale] == 0)
{
$ale_cad = $ale_cad.$ale;
$ale = mt_rand(1,$mat);
if( $ale == $mat )
{
$mat = $mat - 1;
}
$bus = substr_count($ale_cad, $ale);
}
Creamos un bucle en el que miramos si el numero aleatorio que ha salido esta en la lista o si el valor de tal numero es 0( aclaro que $h[$ale] tiene un valor del 0 al 3, con lo que si es 0, ya no puedo ponerlo mas veces en el horario). Si ocurre alguno de estas dos cosas, se mete en el bucle para cambiar de numero y si es el ultimo se vuelve a restar, al final se vuelve al bucle para ver si es un numero valido. Se vuelve a buscar en la cadena para ver si no esta en ella.
Código PHP:
$mat = $amat;
$ale_cad = $ale_cad.$ale;
$h[$ale] = $h[$ale] - 1;
Si logra pasar el bucle, significa que tenemos un numero valido, nunca usado antes, y cuyo valor de $h[numero] no es 0 y por tanto puedo asignarlo otr vez.
en cuanto a $mat = $amat volvemos a asignarle su antiguo valor para scripts siguientes. Tambien inscribimos el numero en la cadena para que no pueda volver a ser escogido y restamos 1 a $h[numero] con lo que si es 0, luego ya no podra ser cojido en ningun dia.
Esto es todo, creo que esta bastante bien estructurado, pero no funciona optimamente.
A ver si alguien puede decirme metodos mas rapidos de algorritmos para este caso.
Porcierto, cuando el script se me bloquea siempre se me queda en esta linea
Código PHP:
$bus = substr_count($ale_cad, $ale);
He pensado en cambiarla pero no se me ocurre una alternativa mas rapida.
Muchas gracias a todos por su tiempo y disculpen el toston este....