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

Come funziona Random() in PostgreSQL

In PostgreSQL, il random() La funzione restituisce un valore pseudo-casuale nell'intervallo 0.0 <=x <1.0.

Utilizza un semplice algoritmo congruenziale lineare, che è uno dei più antichi e conosciuti algoritmi di generazione di numeri pseudocasuali.

Un numero pseudo-casuale è un numero che sembra essere casuale, ma non è veramente casuale. Un numero pseudo-casuale non è veramente casuale perché il suo valore è stato generato da un seme noto. Tuttavia, sembrerà casuale se l'utente non è a conoscenza del seme o dell'algoritmo che lo ha creato.

Pertanto, i numeri pseudocasuali sono spesso considerati abbastanza buoni per molte applicazioni.

Esempio

Ecco un esempio di generazione di un numero pseudo-casuale con random() funzione.

SELECT random();

Risultato:

0.625357600199532

Il risultato sarà ovviamente diverso ogni volta che lo chiami.

Ecco un altro esempio in cui chiamo la funzione tre volte nella stessa istruzione.

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

Risultato:

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

Numero casuale compreso tra 1 e 10

Ecco un esempio di generazione di un numero positivo compreso tra 0 e 10.

SELECT random() * 10 + 1;

Risultato:

4.564859004063727

Giusto per essere chiari, questo genera un numero casuale che è>=1 e <10.

Intero casuale

Puoi usare una funzione come trunc() o floor() per restituire il numero casuale come intero.

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

Risultato:

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

Restituisci righe casuali

Puoi usare random() in un ORDER BY clausola di una query del database per restituire righe casuali.

Ecco un esempio che interroga la pagila database di esempio.

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

Risultato:

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

Ed ecco cosa ottengo se lo eseguo di nuovo:

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

Se hai una tabella di grandi dimensioni e devi restituire tutte le righe (o molte righe), potresti voler modificare la tua query in qualcosa del genere:

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

Crea numeri casuali ripetibili

Postgres ha anche un setseed() funzione che ti consente di impostare un seme per il successivo random() chiamate all'interno della stessa sessione.

Puoi usare setseed() per generare random() ripetibile chiamate.

Vedi come funziona Setseed() in Postgres per esempi.