Dans PostgreSQL, le random()
La fonction renvoie une valeur pseudo-aléatoire dans la plage 0.0 <=x <1.0.
Il utilise un algorithme congruentiel linéaire simple, qui est l'un des algorithmes générateurs de nombres pseudo-aléatoires les plus anciens et les plus connus.
Un nombre pseudo-aléatoire est un nombre qui semble être aléatoire, mais qui n'est pas vraiment aléatoire. Un nombre pseudo-aléatoire n'est pas vraiment aléatoire car sa valeur a été générée par une graine connue. Cependant, il semblera aléatoire si l'utilisateur n'a aucune connaissance de la graine ou de l'algorithme qui l'a créé.
Par conséquent, les nombres pseudo-aléatoires sont souvent considérés comme suffisants pour de nombreuses applications.
Exemple
Voici un exemple de génération d'un nombre pseudo-aléatoire avec le random()
fonction.
SELECT random();
Résultat :
0.625357600199532
Le résultat sera évidemment différent à chaque fois que vous l'appelez.
Voici un autre exemple où j'appelle la fonction trois fois dans la même instruction.
SELECT
random(),
random(),
random();
Résultat :
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Nombre aléatoire entre 1 et 10
Voici un exemple de génération d'un nombre positif entre 0 et 10.
SELECT random() * 10 + 1;
Résultat :
4.564859004063727
Juste pour être clair, cela génère un nombre aléatoire qui est>=1 et <10.
Entier aléatoire
Vous pouvez utiliser une fonction telle que trunc()
ou floor()
pour renvoyer le nombre aléatoire sous forme d'entier.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Résultat :
trunc | floor -------+------- 1 | 8
Renvoyer des lignes aléatoires
Vous pouvez utiliser random()
dans un ORDER BY
clause d'une requête de base de données pour renvoyer des lignes aléatoires.
Voici un exemple qui interroge la pagila exemple de base de données.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Résultat :
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
Et voici ce que j'obtiens si je l'exécute à nouveau :
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Si vous avez une grande table et que vous devez renvoyer toutes les lignes (ou beaucoup de lignes), vous pouvez modifier votre requête en quelque chose comme ceci :
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Créer des nombres aléatoires répétables
Postgres a aussi un setseed()
fonction qui vous permet de définir une graine pour le random()
suivant appels au cours de la même session.
Vous pouvez utiliser setseed()
pour générer random()
répétable appels.
Voir comment Setseed() fonctionne dans Postgres pour des exemples.