MariaDB incluye un RAND()
Función que devuelve un número aleatorio. Más precisamente, devuelve un DOUBLE
valor de punto flotante de precisión v
en el rango 0 <= v < 1.0
.
Esto es genial, pero ¿qué sucede si desea generar un número entero dentro de un rango mayor, y un rango que usted especifique?
Afortunadamente, hay una técnica fácil para hacer esto.
La Técnica
La clave para devolver un número entero aleatorio dentro de un rango específico está en la siguiente sintaxis:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Esto usa el FLOOR()
función para devolver el valor entero más grande que no sea mayor que su argumento. Viendo como nuestro RAND()
La función es parte del argumento, todo lo que tenemos que hacer es aplicar algunos cálculos más para especificar nuestros valores aleatorios mínimos y máximos requeridos.
Generar un entero aleatorio entre 1 y 10
Entonces, usando la sintaxis anterior, aquí hay un ejemplo de cómo generar un número entero aleatorio entre 1 y 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultado:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 7 | +---------------------------------+
Llamémoslo un poco más para ver el efecto aleatorio:
SELECT
FLOOR(1 + RAND() * (10 - 1 +1)) AS r1,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r2,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r3,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r4,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r5,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r6,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r7,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r8;
Resultado:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Generar un entero aleatorio entre 1 y 100
Para generar un número aleatorio entre 1 y 100, todo lo que necesitamos hacer es reemplazar 10 con 100:
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Resultado:
+----------------------------------+ | FLOOR(1 + RAND() * (100 - 1 +1)) | +----------------------------------+ | 87 | +----------------------------------+
Llamémoslo un poco más para ver el efecto aleatorio:
SELECT
FLOOR(1 + RAND() * (100 - 1 +1)) AS r1,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r2,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r3,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r4,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r5,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r6,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r7,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r8;
Resultado:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 61 | 45 | 41 | 68 | 19 | 92 | 99 | 18 | +----+----+----+----+----+----+----+----+
Generar un entero aleatorio entre 10000 y 50000
Hagamos uno más, esta vez generando un número aleatorio entre 10000 y 50000:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Resultado:
+--------------------------------------------+ | FLOOR(10000 + RAND() * (50000 - 10000 +1)) | +--------------------------------------------+ | 46884 | +--------------------------------------------+
Y algunas llamadas más para ver el efecto aleatorio:
SELECT
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r1,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r2,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r3,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r4,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r5,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r6,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r7,
FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r8;
Resultado:
+-------+-------+-------+-------+-------+-------+-------+-------+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +-------+-------+-------+-------+-------+-------+-------+-------+ | 13688 | 37790 | 17884 | 46052 | 46608 | 44880 | 34578 | 28249 | +-------+-------+-------+-------+-------+-------+-------+-------+