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

Comment Random() fonctionne dans PostgreSQL

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.