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

Facultatif :

seed

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

Si aucun seed n’est fourni, un seed aléatoire est choisi de manière spécifique à la plate-forme.

Notes sur l’utilisation

  • Si une instruction SQL appelle RANDOM avec le même seed pour chaque ligne, alors RANDOM renvoie une valeur différente pour chaque ligne, même si le seed est le même.

  • Si une instruction SQL appelle RANDOM plusieurs fois avec le même seed pour la même ligne, alors RANDOM renvoie la même valeur pour chaque appel pour cette ligne. Par exemple, la commande suivante renvoie deux fois la même valeur pour chaque ligne : select random(42), random(42) from table1.

    Voir les exemples ci-dessous.

  • Si une instruction qui appelle RANDOM est exécutée plusieurs fois, il n’y a aucune garantie que RANDOM générera le même ensemble de valeurs à chaque fois. Ceci est vrai que vous spécifiez ou non un seed.

    Bien que la même instruction soit appelée avec les mêmes données, RANDOM peut produire des valeurs différentes. Par exemple, cela peut se produire lorsque :

    • Le nombre de threads de travail est différent.

    • Les lignes sont traitées dans un ordre différent.

  • 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

Ces exemples montrent comment utiliser la fonction RANDOM. Les valeurs affichées dans le résultat ci-dessous peuvent différer des valeurs renvoyées lorsque vous exécutez vous-même ces exemples.

L’exemple suivant appelle RANDOM sans seed. La sortie pour chaque ligne est différente.

SELECT random() FROM table(generator(rowCount => 3));

+----------------------+
|             RANDOM() |
|----------------------|
|  -962378740685764490 |
|  2115408279841266588 |
| -3473099493125344079 |
+----------------------+

L’exemple suivant appelle RANDOM avec le même seed pour chaque ligne. Bien que le seed soit une constante, la sortie pour chaque ligne est toujours différente.

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

L’exemple suivant appelle RANDOM plusieurs fois dans une seule instruction et n’utilise pas de seed. RANDOM renvoie des valeurs différentes dans chaque ligne, ainsi que des valeurs différentes pour des lignes différentes :

SELECT random(), random() FROM table(generator(rowCount => 3));

+----------------------+----------------------+
|             RANDOM() |             RANDOM() |
|----------------------+----------------------|
|  3150854865719208303 | -5331309978450480587 |
| -8117961043441270292 |   738998101727879972 |
|  6683692108700370630 |  7526520486590420231 |
+----------------------+----------------------+

L’exemple suivant appelle RANDOM plusieurs fois dans une seule instruction et utilise le même seed pour chacun de ces appels. RANDOM renvoie la même valeur dans chaque ligne, mais des valeurs différentes pour des lignes différentes :

SELECT random(4711), random(4711) FROM table(generator(rowCount => 3));
+----------------------+----------------------+
|         RANDOM(4711) |         RANDOM(4711) |
|----------------------+----------------------|
| -3581185414942383166 | -3581185414942383166 |
|  1570543588041465562 |  1570543588041465562 |
| -6684111782596764647 | -6684111782596764647 |
+----------------------+----------------------+