MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment générer un entier aléatoire dans une plage dans MariaDB

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