PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktionsweise von Random() in PostgreSQL

In PostgreSQL das random() -Funktion gibt einen Pseudozufallswert im Bereich 0,0 <=x <1,0 zurück.

Es verwendet einen einfachen linearen kongruenten Algorithmus, der einer der ältesten und bekanntesten Algorithmen zur Erzeugung von Pseudozufallszahlen ist.

Eine Pseudozufallszahl ist eine Zahl, die zufällig erscheint, aber nicht wirklich zufällig ist. Eine Pseudozufallszahl ist nicht wirklich zufällig, da ihr Wert von einem bekannten Seed generiert wurde. Es scheint jedoch zufällig zu sein, wenn der Benutzer den Seed oder Algorithmus, der ihn erstellt hat, nicht kennt.

Daher werden Pseudozufallszahlen für viele Anwendungen oft als gut genug angesehen.

Beispiel

Hier ist ein Beispiel für die Generierung einer Pseudozufallszahl mit random() Funktion.

SELECT random();

Ergebnis:

0.625357600199532

Das Ergebnis wird natürlich bei jedem Aufruf anders sein.

Hier ist ein weiteres Beispiel, in dem ich die Funktion dreimal in derselben Anweisung aufrufe.

SELECT 
  random(),
  random(),
  random();

Ergebnis:

 random            | random              | random
-------------------+---------------------+--------------------
 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314

Zufallszahl zwischen 1 und 10

Hier ist ein Beispiel für die Generierung einer positiven Zahl zwischen 0 und 10.

SELECT random() * 10 + 1;

Ergebnis:

4.564859004063727

Nur um das klarzustellen, dies generiert eine Zufallszahl, die>=1 und <10 ist.

Zufallszahl

Sie können eine Funktion wie trunc() verwenden oder floor() um die Zufallszahl als Ganzzahl zurückzugeben.

SELECT 
  trunc(random() * 10 + 1),
  floor(random() * 10 + 1);

Ergebnis:

 trunc | floor
-------+-------
     1 |     8

Zufällige Zeilen zurückgeben

Sie können random() verwenden in einem ORDER BY Klausel einer Datenbankabfrage, um zufällige Zeilen zurückzugeben.

Hier ist ein Beispiel, das die Pagila abfragt Beispieldatenbank.

SELECT 
  film_id,
  title
FROM film 
ORDER BY random() LIMIT 5;

Ergebnis:

 film_id |        title        
---------+---------------------
     116 | CANDIDATE PERDITION
     806 | SLEEPY JAPANESE
     892 | TITANIC BOONDOCK
     826 | SPEED SUIT
     612 | MUSSOLINI SPOILERS

Und hier ist, was ich bekomme, wenn ich es erneut ausführe:

 film_id |       title        
---------+--------------------
     450 | IDOLS SNATCHERS
     827 | SPICE SORORITY
     593 | MONTEREY LABYRINTH
     529 | LONELY ELEPHANT
     591 | MONSOON CAUSE

Wenn Sie eine große Tabelle haben und alle Zeilen (oder viele Zeilen) zurückgeben müssen, möchten Sie Ihre Abfrage vielleicht so ändern:

SELECT *
FROM film 
WHERE film_id IN 
  (SELECT film_id FROM film ORDER BY random() LIMIT 5);

Erstellen Sie wiederholbare Zufallszahlen

Postgres hat auch ein setseed() Funktion, mit der Sie einen Startwert für nachfolgende random() festlegen können Anrufe innerhalb derselben Sitzung.

Sie können setseed() verwenden um wiederholbares random() zu generieren Anrufe.

Beispiele finden Sie unter Funktionsweise von Setseed() in Postgres.