Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Rand con ProbabilidadesDefinidas

Estas en el tema de Rand con ProbabilidadesDefinidas en el foro de Mysql en Foros del Web. Hola a todos! Estoy queriendo usar Cita: ORDER BY RAND() LIMIT 1 Pero con la diferencia de que algunas filas tendrán más valor unas que ...
  #1 (permalink)  
Antiguo 05/09/2013, 05:26
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Rand con ProbabilidadesDefinidas

Hola a todos!

Estoy queriendo usar

Cita:
ORDER BY RAND() LIMIT 1
Pero con la diferencia de que algunas filas tendrán más valor unas que otras, por ende, deberian salir más seguido. Mi idea es agregar und columna que sea con decimales tipo del "0" al "1" y en el medio "0.4", "0.8" y así. O del 1 al 10.

Mi pregunta es:

Como hago interactuar RAND() con esa columna?

Gracias!
  #2 (permalink)  
Antiguo 05/09/2013, 07:05
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años
Puntos: 19
Respuesta: Rand con ProbabilidadesDefinidas

Si no me equivoco la función RAND() lo que hace es tomar una columna de la tabla de forma aleatoria y ordenar los registros según esa columna.

Acá puedes ver la documentación en Mysql http://dev.mysql.com/doc/refman/5.0/...functions.html
  #3 (permalink)  
Antiguo 05/09/2013, 13:42
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Respuesta: Rand con ProbabilidadesDefinidas

Cita:
Iniciado por jlct Ver Mensaje
Si no me equivoco la función RAND() lo que hace es tomar una columna de la tabla de forma aleatoria y ordenar los registros según esa columna.

Acá puedes ver la documentación en Mysql http://dev.mysql.com/doc/refman/5.0/...functions.html
Vi la documentación, pero me parece que no puedo hacer lo que quiero hacer.
Osea, no se como darle "más aleatoriedad" a ciertos campos que a otros con la función. Osea, rand es rand, pero... ¿que pasa si quiero que un campo salga más seguido que otro SIN DEJAR DE APLICAR RAND?

¿Se puede? ¿Como se puede hacer?
  #4 (permalink)  
Antiguo 05/09/2013, 14:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Rand con ProbabilidadesDefinidas

Hola dezagus:

en realidad no hay un camino para hacer lo que quieres, pero se me ocurre por ejemplo que tú hagas una clasificación de los registros que quieres que aparezcan más... por ejemplo, si tienes 10 registros así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------------+-----------+
  3. | id   | descripcion | prioridad |
  4. +------+-------------+-----------+
  5. |    1 | uno         |         1 |
  6. |    2 | dos         |         1 |
  7. |    3 | tres        |         1 |
  8. |    4 | cuatro      |         1 |
  9. |    5 | cinco       |         1 |
  10. |    6 | seis        |         1 |
  11. |    7 | siete       |         1 |
  12. |    8 | ocho        |         2 |
  13. |    9 | nueve       |         2 |
  14. |   10 | diez        |         2 |
  15. +------+-------------+-----------+
  16. 10 rows in set (0.00 sec)

es decir, te interesa que los registros marcados con prioridad 1 aparezcan más frecuentemente que los de prioridad 2, pero que el orden siga siendo aleatorio. Si quieres obtener tres registros por ejemplo, y te interesa que dos de ellos sean prioridad 1 y uno de ellos prioridad 2, no puedes hacer un simple ORDER BY RAND(), pues puede pasar esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla ORDER BY RAND() LIMIT 3;
  2. +------+-------------+-----------+
  3. | id   | descripcion | prioridad |
  4. +------+-------------+-----------+
  5. |    8 | ocho        |         2 |
  6. |    7 | siete       |         1 |
  7. |    9 | nueve       |         2 |
  8. +------+-------------+-----------+
  9. 3 rows in set (0.00 sec)

es decir, aquí aparecen tres registros al azar, pero dos de ellos tienen prioridad 2, sin embargo, puedes hacer uso de UNION's para diferenciar por las distintas prioridades, así:

Código MySQL:
Ver original
  1. mysql> (SELECT * FROM tabla WHERE prioridad = 1 ORDER BY RAND() LIMIT 2)
  2.     -> UNION
  3.     -> (SELECT * FROM tabla WHERE prioridad = 2 ORDER BY RAND() LIMIT 1);
  4. +------+-------------+-----------+
  5. | id   | descripcion | prioridad |
  6. +------+-------------+-----------+
  7. |    1 | uno         |         1 |
  8. |    4 | cuatro      |         1 |
  9. |    9 | nueve       |         2 |
  10. +------+-------------+-----------+
  11. 3 rows in set (0.00 sec)

De esta manera SIEMPRE OBTIENES DOS REGISTROS CON PRIORIDAD 1 y un registro con prioridad 2, pero el orden de los registros está dado por el azar.

Dale un vistazo para ver si te sirve esto.

Saludos
Leo.
  #5 (permalink)  
Antiguo 05/09/2013, 15:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Rand con ProbabilidadesDefinidas

No sé, no lo veo fácil, pero ofreceré otras dos opciones, aunque un tipo de letras como yo sabe poco de estas cuestiones de probabilidades y seguro que meteré la pata. Dos ocurrencias mías.
Lo que hace RAND() es asignar un número decimal entre 0 y 1 aleatorio para cada registro. Luego ordenas y limitas por el primero. En realidad el orden es ascendente, pero si eliges el último seguirá siendo lo aleatorio que es un RAND() de MySQL. Si creas un campo control de 0 a 1 decimal, podrías multiplicar por ese decimal, que tendrá que ser proporcional y ordenar DESC y hacer el limit 1.
Código MySQL:
Ver original
  1. SELECT campo, (RAND() * numcontrol) valor FROM tutabla ORDER BY valor DESC LIMIT 1
Pero si te soy sincero no sé si eso será lo aleatorio que debería ser. Si quieres que sea realmente aleatorio inserta un número de registros proporcional, repitiendo las veces que sea necesario un término.
Imaginemos que valor1 quieres que sea un 30 por ciento más probable que los demás. Pues insertas 3 veces el registro con ese valor sobre un total de 10 valores, y luego ordenas por BY RAND() y LIMIT 1. Ese sí sería, pienso, un modo mejor de hacerlo. Un ejemplo que, creo, será más esclarecedor. Si quieres que para valor1 sea 0.8, para valor2 1.2, para valor3 0.2, bastará con que halla 80 registros con valor1, 120 con valor 2, 20 con valor3. Esa sería la idea.

Última edición por jurena; 06/09/2013 a las 00:54
  #6 (permalink)  
Antiguo 05/09/2013, 20:39
 
Fecha de Ingreso: abril-2010
Ubicación: Ping: BSAS - Arg
Mensajes: 791
Antigüedad: 14 años
Puntos: 25
Respuesta: Rand con ProbabilidadesDefinidas

@leonardo_josue y @jurena, me quito el sombrero. Voy a probar las dos maneras mañana y les comento cual es la más práctica, pero leyendo en teoria ámbas funcionarian.

¡Millones de gracias!

Por cierto, no funcionan las citas en FDW! Lo reportaré...

Etiquetas: rand
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:07.