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

Funktionsweise von Setseed() in PostgreSQL

In PostgreSQL der setseed() Funktion setzt den Seed für nachfolgende random() Anrufe (Wert zwischen -1,0 und 1,0 einschließlich).

Der random() Funktion generiert eine Pseudozufallszahl mit einem einfachen linearen kongruenten Algorithmus.

Wenn setseed() aufgerufen wird, die Ergebnisse nachfolgender random() Aufrufe in der aktuellen Sitzung können wiederholt werden, indem setseed() erneut ausgegeben wird mit dem gleichen Argument.

Beispiel

Hier ist ein Beispiel, um zu demonstrieren, wie es funktioniert.

SELECT 
  setseed(0.8),
  random(), 
  random();

Ergebnis:

 setseed | random             | random
---------+--------------------+--------------------
         | 0.7998745861323613 | 0.9776304992484732

Wenn ich jetzt dieselbe Anweisung noch einmal ausführe, erhalte ich genau dasselbe Ergebnis:

 setseed | random             | random
---------+--------------------+--------------------
         | 0.7998745861323613 | 0.9776304992484732

Nur um das klarzustellen, hier ist die vollständige Ausgabe in meinem Terminal, wenn ich beide SELECT ausführe Anweisungen gleichzeitig.

SELECT 
  setseed(0.8),
  random(), 
  random();

SELECT 
  setseed(0.8),
  random(), 
  random();

Ergebnis:

postgres=# SELECT 
postgres-#   setseed(0.8),
postgres-#   random(), 
postgres-#   random();
 setseed |       random       |       random       
---------+--------------------+--------------------
         | 0.7998745861323613 | 0.9776304992484732
(1 row)


postgres=# 
postgres=# SELECT 
postgres-#   setseed(0.8),
postgres-#   random(), 
postgres-#   random();
 setseed |       random       |       random       
---------+--------------------+--------------------
         | 0.7998745861323613 | 0.9776304992484732
(1 row)

Beispiel OHNE Seteed()

Hier ist nun, was passiert, wenn ich beide Anweisungen erneut ausführe, aber ohne setseed() Funktion.

SELECT 
  random(), 
  random();

SELECT 
  random(), 
  random();

Ergebnis:

postgres=# SELECT 
postgres-#   random(), 
postgres-#   random();
       random       |       random       
--------------------+--------------------
 0.8789931563830109 | 0.8981750563441189
(1 row)


postgres=# 
postgres=# SELECT 
postgres-#   random(), 
postgres-#   random();
       random       |      random       
--------------------+-------------------
 0.3630186384623926 | 0.909389353037664
(1 row)

In diesem Fall hat die zweite Anweisung also einen ganz neuen Satz von Zufallszahlen generiert.