I PostgreSQL, setseed()
funktionen ställer in kärnan för efterföljande random()
anrop (värde mellan -1,0 och 1,0 inklusive).
random()
funktionen genererar ett pseudoslumptal med en enkel linjär kongruentialalgoritm.
Om setseed()
anropas, resultatet av efterföljande random()
anrop i den aktuella sessionen är repeterbara genom att återutge setseed()
med samma argument.
Exempel
Här är ett exempel för att visa hur det fungerar.
SELECT
setseed(0.8),
random(),
random();
Resultat:
setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732
Nu, om jag kör samma uttalande igen, får jag exakt samma resultat:
setseed | random | random ---------+--------------------+-------------------- | 0.7998745861323613 | 0.9776304992484732
Bara för att vara tydlig, här är hela resultatet i min terminal när jag kör båda SELECT
uttalanden samtidigt.
SELECT
setseed(0.8),
random(),
random();
SELECT
setseed(0.8),
random(),
random();
Resultat:
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)
Exempel UTAN Setseed()
Här är vad som händer om jag kör båda satserna igen, men utan setseed()
funktion.
SELECT
random(),
random();
SELECT
random(),
random();
Resultat:
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)
Så i det här fallet genererade den andra satsen en helt ny uppsättning slumptal.