En MariaDB, RAND()
es una función integrada que devuelve un DOUBLE
aleatorio valor de punto flotante de precisión v
en el rango 0 <= v < 1.0
.
Sintaxis
RAND()
se puede utilizar de las dos formas siguientes:
RAND()
RAND(N)
Donde N
es un entero constante que se utilizará como valor inicial.
Cuando se usa un valor semilla, RAND()
produce una secuencia repetible de valores de columna.
Ejemplo
Aquí hay un ejemplo para demostrar RAND()
sin especificar un valor semilla:
SELECT RAND();
Resultado:
+---------------------+ | RAND() | +---------------------+ | 0.14470310708945908 | +---------------------+
Ejemplo:con una semilla
Aquí hay un ejemplo para demostrar RAND()
con un valor inicial:
SELECT RAND(3);
Resultado:
+--------------------+ | RAND(3) | +--------------------+ | 0.9057697559760601 | +--------------------+
En realidad, no podemos notar la diferencia cuando usamos el ejemplo anterior. Para ver la diferencia, necesitamos hacer múltiples llamadas a funciones usando la misma semilla.
Así:
SELECT
RAND(3),
RAND(3),
RAND(3);
Resultado:
+--------------------+--------------------+--------------------+ | RAND(3) | RAND(3) | RAND(3) | +--------------------+--------------------+--------------------+ | 0.9057697559760601 | 0.9057697559760601 | 0.9057697559760601 | +--------------------+--------------------+--------------------+
Podemos ver que las tres llamadas dieron como resultado el mismo valor.
Esto es lo que sucede cuando omitimos el valor semilla:
SELECT
RAND(),
RAND(),
RAND();
Resultado:
+--------------------+---------------------+---------------------+ | RAND() | RAND() | RAND() | +--------------------+---------------------+---------------------+ | 0.7037061310407763 | 0.08442136466914915 | 0.31098846095706195 | +--------------------+---------------------+---------------------+
Cada llamada devuelve un valor diferente.
Entero aleatorio dentro de un rango
Podemos combinar RAND()
con FLOOR()
, junto con algunos cálculos, para devolver un número entero aleatorio dentro de un rango.
La sintaxis para hacer esto es así:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Entonces, podríamos hacer lo siguiente para devolver un número entero aleatorio entre 1 y 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultado:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 6 | +---------------------------------+
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 | +----+----+----+----+----+----+----+----+
Devolver filas aleatorias de una tabla
RAND()
se puede usar junto con un ORDER BY
cláusula y el LIMIT
palabra clave para devolver filas aleatorias de una tabla de base de datos:
SELECT
PetId,
PetName
FROM Pets
ORDER BY RAND()
LIMIT 5;
Resultado de ejemplo:
+-------+---------+ | PetId | PetName | +-------+---------+ | 5 | Tweet | | 7 | Bark | | 1 | Fluffy | | 8 | Meow | | 3 | Scratch | +-------+---------+
Y si lo ejecuto de nuevo, obtengo esto:
+-------+---------+ | PetId | PetName | +-------+---------+ | 3 | Scratch | | 8 | Meow | | 4 | Wag | | 7 | Bark | | 6 | Fluffy | +-------+---------+
Y así sucesivamente…
Aunque, tenga en cuenta que esto es bastante intensivo y no debe usarse en tablas más grandes. Consulte Muestreo de datos:Técnicas para encontrar de manera eficiente una fila aleatoria en el sitio web de MariaDB para obtener técnicas más adecuadas para tablas más grandes.
Semilla no numérica
Este es un ejemplo de lo que sucede cuando proporcionamos un valor inicial no numérico:
SELECT RAND('five');
Resultado:
+---------------------+ | RAND('five') | +---------------------+ | 0.15522042769493574 | +---------------------+ 1 row in set, 1 warning (0.000 sec)
Veamos la advertencia:
SHOW WARNINGS;
Resultado:
+---------+------+-------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'five' | +---------+------+-------------------------------------------+
Además, esto tiende a devolver el mismo resultado, independientemente de qué semilla no numérica se use. Por ejemplo, si le tiro diferentes semillas no numéricas, obtengo el mismo resultado:
SELECT
RAND('one'),
RAND('two'),
RAND('three');
Resultado:
+---------------------+---------------------+---------------------+ | RAND('one') | RAND('two') | RAND('three') | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+ 1 row in set, 3 warnings (0.000 sec)
Revisa las advertencias:
SHOW WARNINGS;
Resultado:
+---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 1292 | Truncated incorrect INTEGER value: 'one' | | Warning | 1292 | Truncated incorrect INTEGER value: 'two' | | Warning | 1292 | Truncated incorrect INTEGER value: 'three' | +---------+------+--------------------------------------------+
Argumentos nulos
RAND()
devuelve el mismo valor cuando la semilla es null
:
SELECT
RAND(null),
RAND(null),
RAND(null);
Resultado:
+---------------------+---------------------+---------------------+ | RAND(null) | RAND(null) | RAND(null) | +---------------------+---------------------+---------------------+ | 0.15522042769493574 | 0.15522042769493574 | 0.15522042769493574 | +---------------------+---------------------+---------------------+
Aunque, en este caso, no hay advertencias.
Demasiados Argumentos
Llamando a RAND()
con demasiados argumentos da como resultado un error:
SELECT RAND(1, 2);
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'RAND'