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.

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 une instruction appelle RANDOM plusieurs fois avec la même seed (par exemple, SELECT RANDOM(42), RANDOM(42);), RANDOM renvoie la même valeur pour chaque appel effectué pendant l’exécution de cette instruction.

    Voir les exemples ci-dessous.

  • Si une instruction appelle RANDOM (avec ou sans seed), il n’y a aucune garantie que que RANDOM générera le même ensemble de valeurs pour chaque exécution de cette instruction.

    Voir la note dans Exemples dans cette rubrique.

  • 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.

Note

Ne dépendez pas du fait que RANDOM renvoie les mêmes valeurs à chaque exécution.

Le même exemple exécuté par différents threads de travail peut produire des valeurs différentes pour RANDOM.

L’exemple suivant appelle RANDOM sans seed :

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

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

L’exemple suivant appelle RANDOM avec seed :

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

Comme expliqué dans les Notes sur l’utilisation, si vous appelez RANDOM plusieurs fois dans la même instruction et que vous passez la même seed à chaque appel, RANDOM renvoie la même valeur pour tous les appels dans l’exécution de cette instruction.

Par exemple, l’exécution de cette instruction génère la même valeur pour les deux appels à RANDOM :

SELECT random(4711), random(4711);
+----------------------+----------------------+
|         RANDOM(4711) |         RANDOM(4711) |
|----------------------+----------------------|
| -3581185414942383166 | -3581185414942383166 |
+----------------------+----------------------+

Si l’instruction est exécutée pour plusieurs lignes, RANDOM renvoie une valeur différente pour chaque ligne. Par exemple, dans une instruction qui génère plusieurs lignes de table, RANDOM produit une valeur différente pour chaque ligne :

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

Comme le montre l’exemple ci-dessus, les appels de la première ligne génèrent une valeur différente de celle des appels des deuxième et troisième lignes.

Notez que cela ne se produit que si vous passez la même seed à RANDOM. Si vous ne passez pas de seed, RANDOM renvoie une valeur différente pour chaque appel dans l’instruction.

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

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