![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Orden aleatorio con Rand() Ineficaz
Hola a todos,
estoy intentando sacar un listado aleatorio de filas con un SELECT en firebird. He estado haciendo pruebas con la función Rand():
Aparentemente, funciona, pero nada más lejos de la realidad. Cada vez que ejecutas el query sin cerrar la aplicación, parece que la función RAND hace su cometido, y ordena las filas aleatoriamente. Pero es falso. Si cierras la aplicación, y la vuelves a abrir, se obtiene exactamente la misma ordenación. Ejemplo: Ejecuto mi aplicación y uso el SELECT anterior y me da este orden: 3-4-2-1 Si vuelvo a ejecutar el Query nuevamente me da un orden diferente: 1-3-4-2 Y así sucesivamente... Si cierro la aplicación y vuelvo a ejecutar el SELECT, obtendré nuevamente la misma ordenación: 3-4-2-1 , luego 1-3-4-2 ... ![]() Si podeis arrojar algo de luz a este asunto, os estaría muy agradecido. Saludos |
#2
|
||||
|
||||
Eso es porque debes inicializar el rand().
Es como en Delphi, antes de usar el random, debes llamar al "randomize()". El problema, es que ahora mismo no se si existe alguna función en Firebird que haga esto, es cuestión de buscarlo por internet. Saludos. |
#3
|
||||
|
||||
Cita:
Como solución provisional, antes de ejecutar el select normal, ejecuto otros selects limitados a dos únicos registros con un único campo en su parámetro de búsqueda. Esta consulta, la ejecuto entre 1 y 100 veces (con la función random propia de delphi). Así al menos me aseguro de que el random maneje 100 posibilidades de inicio distintas. Es una solución bastante cutre, ya que es ejecutar a veces hasta 100 veces una consulta inútil, pero al menos me sirve para inicializar la consulta cuasi-aleatoriamente. Si conocéis alguna otra solución mejor... Saludos |
#4
|
||||
|
||||
Una solución que se me ocurrió fue reemplazar la función rand() del Firebird por otra creada por mi (importarla en forma de UDF), pero después pensé, que es muy raro que lleve un random y no un randomize, así que mire manualmente en el fichero ib_udf2.sql que lleva el Firebird, y efectivamente, he encontrado el srand().
Te copio su descripción:
Saludos. |
#5
|
||||
|
||||
Ante todo, muchas gracias. Funciona perfectamente.
Cuando buscaba una solución, también indagué en la documentación del firebird, pero cuando leí que el srand() era la antigua función rand() que ha sido sustituida recientemente por la rand() actual para evitar que la semilla arrojase valores aleatorios iguales cuando se ejecutaban diversas llamadas en el mismo segundo, la dejé en el olvido: Cita:
Un saludo! |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Numero aleatorio de productos | principiante22 | Impresión | 6 | 04-03-2008 01:24:08 |
Alguien sabe como usar la Función Rand() en firebird | DANNY777 | Firebird e Interbase | 2 | 26-01-2008 16:19:17 |
Select aleatorio | JBalda | Firebird e Interbase | 11 | 27-06-2007 20:28:23 |
Orden aleatorio al 7o digito!!! | jdattoli | Tablas planas | 1 | 20-10-2005 18:15:09 |
Presentar ordern aleatorio en un Select | aerosB4 | Firebird e Interbase | 4 | 16-08-2004 12:53:21 |
![]() |
|