I PostgreSQL er random()
funktion returnerer en pseudo-tilfældig værdi i området 0,0 <=x <1,0.
Den bruger en simpel lineær kongruentiel algoritme, som er en af de ældste og bedst kendte pseudo-tilfældige talgeneratoralgoritmer.
Et pseudo-tilfældigt tal er et tal, der ser ud til at være tilfældigt, men som ikke er sandt tilfældigt. Et pseudo-tilfældigt tal er ikke sandt tilfældigt, fordi dets værdi blev genereret af et kendt frø. Det vil dog se ud til at være tilfældigt, hvis brugeren ikke har kendskab til frøet eller algoritmen, der skabte det.
Derfor anses pseudo-tilfældige tal ofte for at være gode nok til mange applikationer.
Eksempel
Her er et eksempel på generering af et pseudo-tilfældigt tal med random()
funktion.
SELECT random();
Resultat:
0.625357600199532
Resultatet vil naturligvis være anderledes hver gang du kalder det.
Her er et andet eksempel, hvor jeg kalder funktionen tre gange i samme sætning.
SELECT
random(),
random(),
random();
Resultat:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Tilfældigt tal mellem 1 og 10
Her er et eksempel på generering af et positivt tal mellem 0 og 10.
SELECT random() * 10 + 1;
Resultat:
4.564859004063727
For at være klar, genererer dette et tilfældigt tal, der er>=1 og <10.
Tilfældigt heltal
Du kan bruge en funktion såsom trunc()
eller floor()
for at returnere det tilfældige tal som et heltal.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Resultat:
trunc | floor -------+------- 1 | 8
Returner tilfældige rækker
Du kan bruge random()
i en ORDER BY
klausul i en databaseforespørgsel for at returnere tilfældige rækker.
Her er et eksempel, der forespørger på pagila eksempeldatabase.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Resultat:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
Og her er, hvad jeg får, hvis jeg kører det igen:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Hvis du har en stor tabel, og du skal returnere alle rækker (eller mange rækker), vil du måske ændre din forespørgsel til noget som dette:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Opret gentagelige tilfældige tal
Postgres har også en setseed()
funktion, der giver dig mulighed for at indstille et seed for efterfølgende random()
opkald inden for samme session.
Du kan bruge setseed()
for at generere gentagelig random()
opkald.
Se hvordan Setseed() virker i Postgres for eksempler.