Catégories :

Fonctions de génération de données

RANDOM

Chaque appel retourne un entier de 64 bits pseudo-aléatoire.

Syntaxe

RANDOM([seed])

Arguments

seed

La valeur seed est un entier. Différentes valeurs seed feront que RANDOM produira des valeurs de sortie différentes.

Notes sur l’utilisation

  • L’argument facultatif seed doit être une constante entière. Si aucune valeur n’est fournie pour seed, une valeur seed aléatoire est choisie de manière spécifique à la plate-forme.

  • Si vous appelez RANDOM à plusieurs reprises sans seed, les valeurs produites seront différentes pour chaque appel, les deux au sein d’une ligne et ou sur plusieurs lignes.

  • Si vous appelez RANDOM à plusieurs reprises avec le même seed, les valeurs produites seront les mêmes à chaque fois pour une ligne d’entrée donnée. Cependant, différentes lignes dans la sortie ont des valeurs différentes.

  • Les valeurs aléatoires ne sont pas des valeurs nécessairement uniques. Bien que les doublons soient rares pour un petit nombre d’appels, les chances de les doubler augmentent à mesure que le nombre d’appels augmente. Si vous avez besoin de valeurs uniques, utilisez une séquence (SEQ1 / SEQ2 / SEQ4 / SEQ8) plutôt que de faire appel à RANDOM. Choisissez une séquence avec suffisamment de bits de sorte qu’il soit peu probable qu’elle soit bouclée.

  • Étant donné que la sortie est un entier fini et que les valeurs sont générées par un algorithme plutôt que de manière vraiment aléatoire, la fonction finit par « boucler » et commence à répéter des séquences de valeurs. Cependant, la « période » (nombre d’appels avant le bouclage) est extrêmement grande : 2^19937 - 1.

  • La sortie n’est que pseudo-aléatoire ; la sortie peut être prédite avec suffisamment d’informations (y compris l’algorithme et le seed).

  • RANDOM implémente un algorithme Mersenne Twister de 64 bits appelé MT19937-64.

  • Générer des nombres pseudo-aléatoires est un peu coûteux en calcul ; un grand nombre d’appels à cette fonction peut consommer des ressources importantes.

Exemples

En règle générale, RANDOM est utilisé sans valeur seed. Cependant, la plupart de ces exemples utilisent une valeur seed pour que les clients qui exécutent ces commandes obtiennent les mêmes valeurs que celles indiquées dans la documentation :

Voici un exemple simple d’appel de RANDOM avec une valeur seed :

SELECT random(4711) FROM table(generator(rowCount => 5));
+----------------------+
|         RANDOM(4711) |
|----------------------|
| -3581185414942383166 |
|  1570543588041465562 |
| -6684111782596764647 |
| -3878722496384921389 |
| -1136601514902083621 |
+----------------------+

Ces exemples montrent que si vous utilisez le même seed, vous obtenez la même valeur pour des lignes individuelles :

SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(101);
+---------------------+
|         RANDOM(101) |
|---------------------|
| 1126233572059560367 |
+---------------------+
SELECT random(100);
+---------------------+
|         RANDOM(100) |
|---------------------|
| -707166433115721098 |
+---------------------+
SELECT random(101);
+---------------------+
|         RANDOM(101) |
|---------------------|
| 1126233572059560367 |
+---------------------+

Cela montre que si vous appelez RANDOM(<seed>) plusieurs fois dans la même exécution de la même instruction, chaque ligne obtient la même valeur pour chaque appel à RANDOM, mais des lignes différentes obtiennent des valeurs différentes :

Tout d’abord, créez la table et insérez des valeurs.

CREATE OR REPLACE TABLE random1 (i tinyint, j tinyint);
INSERT INTO random1 (i, j) VALUES (-1, -1);
INSERT INTO random1 (i, j) VALUES (-2, -2);

Remplacez les valeurs par des valeurs générées en appelant RANDOM(<seed>).

SET RANDOM_NUMBER_SEED = 100;
UPDATE random1 set i = RANDOM($RANDOM_NUMBER_SEED), j = RANDOM($RANDOM_NUMBER_SEED);

Affichez les valeurs. Dans une ligne, toutes les valeurs générées par RANDOM sont identiques, mais, d’une ligne à l’autre, les valeurs sont différentes :

SELECT i, j FROM random1;
+---------------------+---------------------+
|                   I |                   J |
|---------------------+---------------------|
| -707166433115721098 | -707166433115721098 |
| 5969071622678286091 | 5969071622678286091 |
+---------------------+---------------------+

Notez que si vous ne transmettez pas de valeur seed, les valeurs sont différentes dans chaque ligne, ainsi que différentes sur les lignes.