PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona Setseed() in PostgreSQL

In PostgreSQL, il setseed() la funzione imposta il seme per il successivo random() chiamate (valore compreso tra -1.0 e 1.0, inclusi).

Il random() La funzione genera un numero pseudo-casuale utilizzando un semplice algoritmo congruenziale lineare.

Se setseed() viene chiamato, i risultati del successivo random() le chiamate nella sessione corrente sono ripetibili riemettendo setseed() con lo stesso argomento.

Esempio

Ecco un esempio per dimostrare come funziona.

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

Risultato:

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

Ora, se eseguo di nuovo la stessa istruzione, ottengo esattamente lo stesso risultato:

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

Giusto per essere chiari, ecco l'output completo nel mio terminale quando eseguo entrambi SELECT dichiarazioni allo stesso tempo.

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

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

Risultato:

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)

Esempio SENZA Setseed()

Ora ecco cosa succede se eseguo di nuovo entrambe le istruzioni, ma senza setseed() funzione.

SELECT 
  random(), 
  random();

SELECT 
  random(), 
  random();

Risultato:

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)

Quindi, in questo caso, la seconda istruzione ha generato un insieme completamente nuovo di numeri casuali.