sql >> Base de Datos >  >> RDS >> MariaDB

Cómo generar un entero aleatorio dentro de un rango en MariaDB

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 |
+-------+-------+-------+-------+-------+-------+-------+-------+