Utilizo VC para extraer aleatoriamente 10 registros en ACCESS, seleccione los 10 principales* del orden de la tabla por rnd(ID), ¡pero siempre son los mismos 10!
Algunas personas dicen que agregar Randomize al programa para inicializar la semilla aleatoria es solo la mitad de lo correcto. Simplemente agregar Randomize al programa es inútil. La razón es muy simple y no puede afectar a Rnd. ¡Esto es solo una cadena de Rnd y la declaración SQL se ejecuta a través del motor de base de datos! El motor de base de datos ejecuta las sentencias SQL y, debido a esto, no es posible inicializar la semilla, lo que da como resultado la misma secuencia aleatoria para cada aplicación.
Se puede ver que la clave para resolver el problema radica en cómo inicializar la semilla aleatoria. La sintaxis de la función Rnd es Rnd(número), que tiene la propiedad de que si usas un número con un argumento negativo, se generará una secuencia aleatoria fija. Usando esta característica, nuestro problema se resuelve fácilmente, es decir, usando un número negativo diferente cada vez que se llama a la función Rnd, para lograr el propósito de generar diferentes secuencias aleatorias. Después de las pruebas, el problema se resolvió. El código de muestra es el siguiente:
'...
Atenuar sql como cadena
Atenuar r como único
Aleatorizar p>
r = Rnd
sql = "seleccionar top 1 * de tb ordenar por rnd(" & r &"-id)"
'..... .
Descripción del código: El parámetro Rnd en la declaración SQL es una expresión numérica que debe contener un campo en la tabla (preferiblemente la clave principal), porque la variable r devuelve un valor entre 0 y 1 Aleatorio SINGLE (El valor de ID en la tabla suele ser mayor que 1), de modo que el valor del parámetro se convierte en un número aleatorio menor que 0, generando diferentes secuencias aleatorias.
Además, una sugerencia para solucionar el problema del tiempo es "select top 10 * from tb order by rnd(" & time & "- id)". Esto es factible en algunos casos, pero si es necesario consultar información de forma continua y rápida, por ejemplo, algunos programas de lotería necesitan desplazarse y mostrar información continuamente, en este caso, la información repetida se devolverá varias veces seguidas. La razón de esta situación es que al realizar operaciones numéricas, el tiempo se convertirá en un Doble menor que 1 y rnd devuelve un Single. Obviamente, el resultado devuelto por rnd puede truncar la cola de la operación de identificación de tiempo. de pequeños cambios, el valor devuelto por rnd será el mismo que el valor anterior, por lo que devolverá los mismos resultados de la consulta.