Foros del Web » Programando para Internet » PHP »

Complejo algoritmo PHP-MySQL.- ??? ¿Se podra hacer?

Estas en el tema de Complejo algoritmo PHP-MySQL.- ??? ¿Se podra hacer? en el foro de PHP en Foros del Web. Tabla MySQL Campo : Numero _ chances 18 15 19 5 16 9 5 6 11 5 13 8 1 14 2 2 6 12 ...
  #1 (permalink)  
Antiguo 14/11/2006, 12:20
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
Complejo algoritmo PHP-MySQL.- ??? ¿Se podra hacer?

Tabla MySQL
Campo :
Numero _ chances
18
15
19
5
16
9
5
6
11
5
13
8
1
14
2
2
6
12
3
14
2
6
4
5
8
4
14
9
.
.
.

Amigos buenas tardes., bueno les explico, tengo estos y muchísimos mas valores en una tabla con un campo llamado Numero _ chances. Lo que quería hacer, y cosa que se me dificultado un poco es lo siguiente


en los registros de la tabla nos encontramos que hay miles de registros con valores desde 0 a 19
quería saber si era posible después de hacer la consulta mysql mostrar los resultados de la siguiente manera :

que los registros mayores (como por ejemplo ..., 17, 18, 19) a medida que sean mayor su valor tengan muchísimo mas posibilidades de aparecer en los resultados que los demás, ***"PERO DEJÁNDOLE LA OPCIÓN (así sea menor) QUE LOS NÚMEROS MENORES (ejemplo 0, 1, 2, ...) PUEDAN
APARECER TAMBIÉN en los resultados"***

...en un LIMITE DE 9 resultados por búsqueda.-

se que el uso de un RAND es imprescindible para esto, pero además de el uso del rand supongo que debemos usar un algoritmo un poco complejo para esta
situación.- la cual espero ustedes me puedan ayudar a desarrollar.-

ESPERO ME HAYAN COMPRENDIDOS...

Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #2 (permalink)  
Antiguo 14/11/2006, 13:16
Avatar de iandrade  
Fecha de Ingreso: septiembre-2006
Ubicación: Xalapa, Veracruz, MÉXICO.
Mensajes: 171
Antigüedad: 17 años, 7 meses
Puntos: 6
mmm no entiendo tu plantemiento, pero alcnazo a entender un detalle y creo que puedes hacerlo ordenando tu consulta por ese campo de manera descendente y empleando el limit
es decir
Código PHP:
$sqlConsulta "SELECT * FROM tabla ORDER BY Numero_chances DESC LIMIT 0,9" 
Espero eso sea loq ue buscas, si no es asi, entonces no entendi nada jejeje!
  #3 (permalink)  
Antiguo 14/11/2006, 13:55
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
Cita:
Iniciado por iandrade Ver Mensaje
mmm no entiendo tu plantemiento, pero alcnazo a entender un detalle y

creo que puedes hacerlo ordenando tu consulta por ese campo de manera descendente y empleando el

limit
es decir
Código PHP:
$sqlConsulta "SELECT * FROM tabla ORDER BY Numero_chances DESC LIMIT 0,9" 
Espero eso sea loq ue buscas, si no es asi, entonces no entendi nada jejeje!
Bueno NO ENTENDISTE..

Si lo hago de esa manera, significaria, que los resultados solo arrojaria los primeros 9 registros con los valores mas elevados ordenados de forma DESC

Y ESO NO ES LO QUE SE ANDA BUSCANDO.-

lo que ando buscando es que todos los registros tengan chance de salir en los resultados SEGUN SEA SU VALOR... pero que aya chance para todos... CLARO ESTA : Mientras el valor del campo sea mas elevado mas oportunidades tendra de salir en los resultado.. pero eso no significara que los que tengan menores valores no puedan aparecer , deberian de tener chance de aparecer..

Espero me haya explicado bien

Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com

Última edición por xyyy7; 14/11/2006 a las 14:08
  #4 (permalink)  
Antiguo 14/11/2006, 14:51
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 20 años, 5 meses
Puntos: 4
Checa este ejemplo:
Código PHP:
<?php
// datos de conexion y selección de bd
mysql_pconnect'servername''username' 'password' );
mysql_select_db'base_de_datos' );

$consulta "SELECT Numero_chances FROM tabla ORDER BY Numero_chances DESC"// obtenemos todos los números de chances
$res mysql_query$consulta ); // ejecutamos la consulta
$num_res mysql_num_rows$res ); // obtenemos el número de resultados que se devolvieron

if ( $num_res )
{
   while( 
$fila mysql_fetch_array$res ) )
   {
      
$todos_los_chances[] = $fila['Numero_chances']; // asignamos a un array todos los números de chances
   
}

   
// ordenamos la matriz de forma aleatoria
   
srand ( ( float ) microtime () * 1000000 );
   
shuffle $todos_los_chances );

   
// agarramos sólo 9 valores (o los que necesites, sólo modifica el no. 9 en el bucle) y los almacenamos en otro array
   
for ( $e 0$e 9$e++ )
   {
      
$a_mostrar[] = $todos_los_chances[$e]
   }

   
arsort $a_mostrar ); // ordenamos la matriz en forma descendente por su valor

   // mostramos los resultados
   
foreach ( $a_mostrar as $mostrar )
   {
      echo 
$mostrar."<br/>";
   }
}
else
{
   echo 
"No se obtuvieron resultados. Por favor intentelo más tarde.";
}
?>
Lo que se supone que hace es asignar todos los numeros de chances y almacenarlos en un array para después acomodarlos de forma aleatoria y enseguida tomar sólo los 9 primeros que se ordenaron al azar para asignarselos a otro array que será ordenado en forma descendente para después mostrarlos de esta forma en pantalla.
Espero haberme dado a entender y que esto te sirva por lo menos para darte una idea. Suerte
  #5 (permalink)  
Antiguo 14/11/2006, 19:19
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
yo haria algo asi:

function p($i) {
return rand( rand(0, 15), 19 );
}
$limit = 9;
$rnd = array_map('p', array_pad(array(), 9, 0));

$sql = 'SELECT *
FROM tabla
WHERE campo IN (' . join(',', $rnd) . ')
ORDER BY campo DESC
LIMIT ' . $limit;
  #6 (permalink)  
Antiguo 14/11/2006, 20:29
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
la opcion de foo
NO FUNCIONO.. ya que solo arroja resultados rand, pero sin respetar las posibilidades de chance segun el valor que tenga el campo.-

los resultados son lotes de 2 o 3 numeros consecutivos hasta llegar a 9..

ahora bien, la opcion de Erikfrancisco
se asemeja a lo que busco.. pero amigo.. como hariamos para mostrar tambien los valores de los demas campos existentes aparte del 'Numero_chances' de los registros... ??? ya que tengo que mostrar toda la info de los campos...

los campos que tengo en la tabla son los siguiente : ID. Numero_chances, Numero_Text, Numero_Conten

Gracias
Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #7 (permalink)  
Antiguo 14/11/2006, 20:53
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 17 años, 8 meses
Puntos: 0
Pues esto es un clasico ejemplo de probabilidad ponderada, lo unico que debes hacer es calcular las probabilidades de cada uno y listo

seria
1+2+3+.....+19+20 == 100%

Valor Probabilidad Probabilidad acumulada
1 0.476190476 0.476190476
2 0.952380952 1.428571429
3 1.428571429 2.857142857
4 1.904761905 4.761904762
5 2.380952381 7.142857143
6 2.857142857 10
7 3.333333333 13.33333333
8 3.80952381 17.14285714
9 4.285714286 21.42857143
10 4.761904762 26.19047619
11 5.238095238 31.42857143
12 5.714285714 37.14285714
13 6.19047619 43.33333333
14 6.666666667 50
15 7.142857143 57.14285714
16 7.619047619 64.76190476
17 8.095238095 72.85714286
18 8.571428571 81.42857143
19 9.047619048 90.47619048
20 9.523809524 100

si te fijas la probabilidad acumulada nos da un buen parametro para establece con un simple randomico entre 0 y 100

por ejemplo si tenemos 65.86465 corresponde al rango entre 16 y 17, y por tanto 17.

Ahora la formula.... la voy a pensar
  #8 (permalink)  
Antiguo 14/11/2006, 21:38
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 2 meses
Puntos: 0
Cita:
Iniciado por xyyy7 Ver Mensaje
la opcion de foo
NO FUNCIONO.. ya que solo arroja resultados rand, pero sin respetar las posibilidades de chance segun el valor que tenga el campo.-
no es que no funcione , sino que no es lo que necesitas

Cita:
ahora bien, la opcion de Erikfrancisco
se asemeja a lo que busco.. pero amigo.. como hariamos para mostrar tambien los valores de los demas campos existentes aparte del 'Numero_chances' de los registros... ??? ya que tengo que mostrar toda la info de los campos...

los campos que tengo en la tabla son los siguiente : ID. Numero_chances, Numero_Text, Numero_Conten
si es cierto que tienes muchos datos en esa tabla, no me parece recuperar todos los datos de la tabla para hacer esos calculos.

por cierto, que planteas tu? pareciera que solo estas esperando respuestas, sin participar en la solucion de TU problema :)
  #9 (permalink)  
Antiguo 14/11/2006, 22:08
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 17 años, 8 meses
Puntos: 0
Ya listo, me salio

Código PHP:
function sumatoria($x){
    
$suma=0;
    for(
$i=0;$i<=$x;$i++){
        
$suma += $i;
        }
    return 
$suma;
    }
function 
randponderado($Ro,$Rf){
    
$prueba rand();
    
$maximo getrandmax();
    
    
$resp 0;
    for(
$i=$Ro;$i<$Rf;$i++){
        
        
$ro= (sumatoria($i)*$maximo)/(sumatoria($Rf)-sumatoria($Ro));
        
$rf= (sumatoria($i+1)*$maximo)/(sumatoria($Rf)-sumatoria($Ro));
        
        if(
$prueba $ro && $prueba $rf){
            
$resp $i+1;
            break;
            }
//end if
        
}//end for
    
return $resp;
    }
//end function

echo randponderado(0,20); 
Espero haber entendido bien, no se para que era el mysql??
  #10 (permalink)  
Antiguo 14/11/2006, 22:18
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 17 años, 8 meses
Puntos: 0
AAA ya entendi, funciona muy bien el script que te di para sacar las 9 consultas y lo puedes usar para que ese randomico te escoja el valor del ponderado que debe aparecer, adicional hacer un randomico en tu base de datos para los registros que comparten el mismo ponderado

ahi va un script al ojo
Código PHP:
for($i=0;i<9;i++){
    
$buscar randponderado(0,19);
    
$query "SELECT * FROM tutabla WHERE numero_chances = $buscar ORDER BY RAND LIMIT 1";
    } 
solo eso faltaria la scritp de arriba
  #11 (permalink)  
Antiguo 14/11/2006, 22:42
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 17 años, 8 meses
Puntos: 0
ahora por probabilidades el script que te di es un poco un desastre ya que cuantas veces asome un articulo va a depender directamente de cuantos 20´s 19´s... 1´s exista en la base.

Ahora los mas objetivo seria que calcules la suma total de todos los ponderados

SELECT sum(numero_chances)as total from tutabla

despues con este valor seleccionar un valor intermedio al azar y este valor lo deberas calcular al registro que cumpla con la suma de todos los previos a el.
Es mas o menos lo mismo, pero este query si que esta complejo, seguramente debas usar variables en el propio mysql, o simplemente jalar todas las variables a php lo que seria una barbaridad si tienes muchos registros.

X.
  #12 (permalink)  
Antiguo 15/11/2006, 09:55
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
BUENO BASANDOME en "probabilidad ponderada de seyacat"

/* ----------------------------------------
Valor Probabilidad / Probabilidad acumulada
BASE A 10 / BASE A 10000
1 0.476190476 47
2 0.952380952 142
3 1.428571429 285
4 1.904761905 476
5 2.380952381 714
6 2.857142857 1000
7 3.333333333 1333
8 3.80952381 1714
9 4.285714286 2142
10 4.761904762 2619
11 5.238095238 3142
12 5.714285714 3714
13 6.19047619 4333
14 6.666666667 5000
15 7.142857143 5714
16 7.619047619 6476
17 8.095238095 7285
18 8.571428571 8142
19 9.047619048 9047
20 9.523809524 10000
---------------------------------------- */
TENEMOS QUE :

$md = rand(1,10000)

if ($md <= 47) $ca = 1;
if ($md >= 48 && $md <= 142) $ca = 2;
if ($md >= 143 && $md <= 285) $ca = 3;

// [...] Continuamos hasta llegar al 20

if ($md >= 7286 && $md <= 8142) $ca = 18;
if ($md >= 8143 && $md <= 9047) $ca = 19;
if ($md >= 9048 && $md <= 10000) $ca = 20;

y sacamos el query

$query = "SELECT * FROM tabla WHERE Numero_chances = $ca ORDER BY RAND LIMIT 1";

... y entonces hago un query para cada uno de los resultados que quiero mostrar (que son 9)

PERO HACIENDOLO DE ESTA MANERA PASA LO SIGUIENTE :

1.- si en numero optenido en $ca NO SE ENCUENTRA en los registros se queda el resultado vacio.-

2.- ..si quiero cambiar en algun momento la cantidad de valor maximo (que acualmente es 20) tendre que hacer el algoritmo nuevamente.-

x.- bueno y deberia de haber muchisimas mas contra...

pero demomento es lo que tengo hecho...

como me podrian ayudar.-???


Gracias

Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #13 (permalink)  
Antiguo 15/11/2006, 10:31
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
Rudo no?

Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
  #14 (permalink)  
Antiguo 15/11/2006, 10:33
Avatar de Erikfrancisco  
Fecha de Ingreso: noviembre-2003
Ubicación: Estado de México
Mensajes: 503
Antigüedad: 20 años, 5 meses
Puntos: 4
Pues poniendolo como yo lo hacia, te quedaría así:
Código PHP:
<?php
// datos de conexion y selección de bd
mysql_pconnect'servername''username' 'password' );
mysql_select_db'base_de_datos' );

$consulta "SELECT ID FROM tabla ORDER BY Numero_chances DESC"// obtenemos todos los ID de los números de chances ordenados en forma descendente
$res mysql_query$consulta ); // ejecutamos la consulta
$num_res mysql_num_rows$res ); // obtenemos el número de resultados que se devolvieron

if ( $num_res )
{
   while( 
$fila mysql_fetch_array$res ) )
   {
      
$todos_los_chances[] = $fila['ID']; // asignamos a un array todos los ID de los números de chances
   
}

   
mysql_free_result$res ); // liberamos memoria

   // ordenamos la matriz de forma aleatoria
   
srand ( ( float ) microtime () * 1000000 );
   
shuffle $todos_los_chances );

   
// agarramos sólo 9 valores (o los que necesites, sólo modifica el no. 9 en el bucle) y los almacenamos en otro array
   
for ( $e 0$e 9$e++ )
   {
      
$a_mostrar[] = $todos_los_chances[$e];
   }

   
$mostrar implode","$a_mostrar ); // convertimos en cadena el array $a_mostrar separando los ID por una coma para así pasarselo a la consulta que nos traerá los resultados

   
$consulta2 "SELECT * FROM tabla WHERE ID IN ( $mostrar ) ORDER BY Num_chances DESC"// obtenemos todos los registros que coincidan con los ID de la variable $mostrar
   
$res2 mysql_query$consulta2 ); // ejecutamos la consulta
   
$num_res2 mysql_num_rows$res2 ); // obtenemos el número de resultados que se devolvieron

   
if ( $num_res2 // si se obtuvieron resultados los mostramos en pantalla
   
{
      while ( 
$fila2 mysql_fetch_array$res2 ) )
      {
// mostramos los resultados en pantalla, yo los mostre así pero tu puedes mostrarlos en una tabla o como se te de la gana
         
echo "ID: ".$fila2['ID']." Número de chances: ".$fila2['Numero_chances']." Número de texto: ".$fila2['Numero_Text']." Número de Contenido: ".$fila2['Numero_Conten']."<br/>";
      }
      
mysql_free_resul$res2 ); // liberamos memoria
   
}
   else
   {
      echo 
'Ocurrio un error: No se obtuvieron resultados con los ID de la variable $mostrar.';
   }
}
else
{
   echo 
"No se obtuvieron resultados. Por favor intentelo más tarde.";
}
?>
Como podrás darte cuenta lo único que cambie fue la primer consulta para que en lugar de obtener el Numero_chance obtengamos el ID (esto te va a funcionar sólo si tu campo ID es autoincrement), y despues de esto los valores obtenidos al azar los pasamos a un array para que a este se le ordene de forma aleatoria. Despues lo agarramos sólo los 9 primeros y se los pasamos a otro array para convertirlo en cadena y esta pasarsela a otra consulta que se encargará de obtener todos los registros que coincidan con esos 9 ID para después mostrarlos en pantalla. Espero haberme dado a entender y que ahora sí sea lo que necesitabas. Suerte

Última edición por Erikfrancisco; 15/11/2006 a las 11:42
  #15 (permalink)  
Antiguo 16/11/2006, 12:27
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
Saludos Erikfrancisco Gracias por su respuesta, bueno hermano le cuento que ahora con el script si pude mostrar los demas campos de mis registros, de la manera como esta ahora el algoritmo...

pero llevandolo a la prueba, POSIBILIDADES DE APARECER EN LOS RESULTADOS, segun sea el valor del campo (Numero _ chances) NO SE DIO, hice 1.000 consultas para ver las estadisticas, y note que todos los campos del 1 al 19 tubieron similarmente la misma posibilidad de aparecer en los resultados en LIMIT 0,9,

lo complicado que buscaba es que todos los registros tengan chance de salir en los resultados SEGUN SEA SU VALOR... pero que aya chance para todos... CLARO ESTA : Mientras el valor del campo sea mas elevado mas oportunidades tendra de salir en los resultado.. "pero eso no significara que los que tengan menores valores no puedan aparecer" , deberian de tener chance de aparecer..

Ahora bien.... estube haciendo unas pruebas con la teoria de seyacat que se encuantra dentro el marco de lo que se busca.. pero realmente e visto que vaya que es complicado ...
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com

Última edición por xyyy7; 16/11/2006 a las 14:43
  #16 (permalink)  
Antiguo 16/11/2006, 15:24
Avatar de xyyy7  
Fecha de Ingreso: enero-2004
Ubicación: Maracay.-
Mensajes: 637
Antigüedad: 20 años, 3 meses
Puntos: 5
Estuve buscando en las paginas oficiales de MySQL, para ver si habia alguna manera de ORDER BY ? que me haga esta funcion y nada... paseando por php (LA CUAL CONFIO MÀS) vi algunos arreglos realizados con la funcion getrandmax & rand pero no son usando para consultas del mysql.-

La verdad creo que el grado de complejidad de este posible algoritmo es muy rudo.-
´
Saludos.-
__________________
Maracay Edo Aragua - Venezuela :
Mi Favorita :
http://www.MySQL.Com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:03.