MariaDB inclut un RAND()
fonction qui renvoie un nombre aléatoire. Plus précisément, il renvoie un DOUBLE
valeur en virgule flottante de précision v
dans la plage 0 <= v < 1.0
.
C'est très bien, mais que se passe-t-il si vous souhaitez générer un entier dans une plage plus large - et une plage que vous spécifiez ?
Heureusement, il existe une technique simple pour le faire.
La Technique
La clé renvoyant un entier aléatoire dans une plage spécifique est dans la syntaxe suivante :
FLOOR(min_value + RAND() * (max_value - min_value +1))
Ceci utilise le FLOOR()
fonction pour renvoyer la plus grande valeur entière non supérieure à son argument. Vu que notre RAND()
fonction fait partie de l'argument, tout ce que nous avons à faire est d'appliquer quelques calculs supplémentaires afin de spécifier nos valeurs aléatoires minimales et maximales requises.
Générer un entier aléatoire entre 1 et 10
Ainsi, en utilisant la syntaxe ci-dessus, voici un exemple de génération d'un entier aléatoire entre 1 et 10 :
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Résultat :
+---------------------------------------------+| PLANCHER(1 + RAND() * (10 - 1 +1)) |+-------------------------------- -+| 7 |+---------------------------------------------+
Appelons-le un peu plus pour voir l'effet aléatoire :
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;
Résultat :
+----+----+----+----+----+----+----+----+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+----+----+----+----+----+----+----+----+| 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 |+----+----+----+----+----+----+----+----+
Générer un entier aléatoire entre 1 et 100
Pour générer un nombre aléatoire entre 1 et 100, il suffit de remplacer 10 par 100 :
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Résultat :
+------------------------------------------------+| PLANCHER(1 + RAND() * (100 - 1 +1)) |+-------------------------------- --+| 87 |+----------------------------------+
Appelons-le un peu plus pour voir l'effet aléatoire :
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;
Résultat :
+----+----+----+----+----+----+----+----+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+----+----+----+----+----+----+----+----+| 61 | 45 | 41 | 68 | 19 | 92 | 99 | 18 |+----+----+----+----+----+----+----+----+
Générer un entier aléatoire entre 10 000 et 50 000
Faisons-en un de plus, en générant cette fois un nombre aléatoire entre 10 000 et 50 000 :
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Résultat :
+-------------------------------------------------+| PLANCHER(10000 + RAND() * (50000 - 10000 +1)) |+-------------------------------- ------------+| 46884 |+------------------------------------------------+Et quelques autres appels pour voir l'effet aléatoire :
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;
Résultat :
+-------+-------+-------+-------+-------+------ -+-------+-------+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+-------+-------+-------+-------+-------+------- +-------+-------+| 13688 | 37790 | 17884 | 46052 | 46608 | 44880 | 34578 | 28249 |+-------+-------+-------+-------+-------+------- +-------+-------+