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.