MariaDB inclui um
RAND()
função que retorna um número aleatório. Mais precisamente, ele retorna um DOUBLE
valor de ponto flutuante de precisão v
no intervalo 0 <= v < 1.0
. Isso é ótimo, mas e se você quiser gerar um inteiro dentro de um intervalo maior – e um intervalo que você especificar?
Felizmente, existe uma técnica fácil para fazer isso.
A Técnica
A chave que retorna um inteiro aleatório dentro de um intervalo específico está na seguinte sintaxe:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Isso usa o
FLOOR()
função para retornar o maior valor inteiro não maior que seu argumento. Vendo como nosso RAND()
for parte do argumento, tudo o que precisamos fazer é aplicar mais alguns cálculos para especificar nossos valores aleatórios mínimos e máximos necessários. Gerar um número inteiro aleatório entre 1 e 10
Então, usando a sintaxe acima, aqui está um exemplo de geração de um inteiro aleatório entre 1 e 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultado:
+---------------------------------+| FLOOR(1 + RAND() * (10 - 1 +1)) |+-------------------------------- -+| 7 |+---------------------------------+
Vamos chamá-lo um pouco mais para ver o efeito aleatório:
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 |+----+----+----+----+----+----+----+----+
Gerar um número inteiro aleatório entre 1 e 100
Para gerar um número aleatório entre 1 e 100, basta substituir 10 por 100:
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Resultado:
+----------------------------------+| FLOOR(1 + RAND() * (100 - 1 +1)) |+-------------------------------- --+| 87 |+----------------------------------+
Vamos chamá-lo um pouco mais para ver o efeito aleatório:
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 |+----+----+----+----+----+----+----+----+
Gerar um número inteiro aleatório entre 10.000 e 50.000
Vamos fazer mais uma, desta vez gerando um número aleatório entre 10.000 e 50.000:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Resultado:
+--------------------------------------------+| FLOOR(10000 + RAND() * (50000 - 10000 +1)) |+-------------------------------- ------------+| 46884 |+--------------------------------------------+
E mais algumas chamadas para ver o efeito aleatório:
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 |+-------+-----------+-------+-------+-------+------- +-------+-------+