sql >> Databáze >  >> RDS >> PostgreSQL

Jak Random() funguje v PostgreSQL

V PostgreSQL, random() funkce vrací pseudonáhodnou hodnotu v rozsahu 0,0 <=x <1,0.

Využívá jednoduchý lineární kongruenciální algoritmus, který je jedním z nejstarších a nejznámějších algoritmů generátoru pseudonáhodných čísel.

Pseudonáhodné číslo je číslo, které se zdá být náhodné, ale ve skutečnosti náhodné není. Pseudonáhodné číslo není skutečně náhodné, protože jeho hodnota byla vygenerována známým zdrojem. Pokud však uživatel nezná seed nebo algoritmus, který jej vytvořil, bude se zdát náhodný.

Proto jsou pseudonáhodná čísla často považována za dostatečně dobrá pro mnoho aplikací.

Příklad

Zde je příklad generování pseudonáhodného čísla pomocí random() funkce.

SELECT random();

Výsledek:

0.625357600199532

Výsledek bude samozřejmě pokaždé jiný, když to zavoláte.

Zde je další příklad, kdy funkci volám třikrát ve stejném příkazu.

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

Výsledek:

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

Náhodné číslo mezi 1 a 10

Zde je příklad generování kladného čísla mezi 0 a 10.

SELECT random() * 10 + 1;

Výsledek:

4.564859004063727

Aby bylo jasno, toto generuje náhodné číslo, které je>=1 a <10.

Náhodné celé číslo

Můžete použít funkci jako trunc() nebo floor() vrátit náhodné číslo jako celé číslo.

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

Výsledek:

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

Vrátit náhodné řádky

Můžete použít random() v ORDER BY klauzule databázového dotazu pro vrácení náhodných řádků.

Zde je příklad dotazu na pagila ukázková databáze.

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

Výsledek:

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

A tady je to, co dostanu, když to znovu spustím:

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

Pokud máte velkou tabulku a potřebujete vrátit všechny řádky (nebo hodně řádků), možná budete chtít upravit svůj dotaz na něco takového:

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

Vytváření opakovatelných náhodných čísel

Postgres má také setseed() funkce, která vám umožňuje nastavit zdroj pro následující random() hovory v rámci stejné relace.

Můžete použít setseed() pro generování opakovatelného random() hovory.

Příklady viz Jak Setseed() funguje v Postgresu.


  1. Co mají Poker, Blackjack, Belot a Préférence společného s databázemi?

  2. 5 způsobů, jak získat krátký název měsíce z data na serveru SQL

  3. Třída fondu připojení Oracle

  4. Najděte název hostitele a port pomocí příkazů PSQL