I PostgreSQL, random()
funktion returnerar ett pseudoslumpmässigt värde i intervallet 0,0 <=x <1,0.
Den använder en enkel linjär kongruentialalgoritm, som är en av de äldsta och mest kända genereringsalgoritmerna för pseudoslumptal.
Ett pseudoslumptal är ett tal som verkar vara slumpmässigt, men som inte är riktigt slumpmässigt. Ett pseudoslumptal är inte riktigt slumpmässigt eftersom dess värde genererades av ett känt frö. Det kommer dock att verka slumpmässigt om användaren inte har någon kunskap om fröet eller algoritmen som skapade det.
Därför anses pseudoslumptal ofta vara tillräckligt bra för många tillämpningar.
Exempel
Här är ett exempel på att generera ett pseudoslumptal med random()
funktion.
SELECT random();
Resultat:
0.625357600199532
Resultatet blir uppenbarligen olika varje gång du ringer det.
Här är ett annat exempel där jag anropar funktionen tre gånger i samma programsats.
SELECT
random(),
random(),
random();
Resultat:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Slumptal mellan 1 och 10
Här är ett exempel på att generera ett positivt tal mellan 0 och 10.
SELECT random() * 10 + 1;
Resultat:
4.564859004063727
Bara för att vara tydlig genererar detta ett slumptal som är>=1 och <10.
Slumpmässigt heltal
Du kan använda en funktion som trunc()
eller floor()
för att returnera slumptalet som ett heltal.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Resultat:
trunc | floor -------+------- 1 | 8
Returnera slumpmässiga rader
Du kan använda random()
i en ORDER BY
sats i en databasfråga för att returnera slumpmässiga rader.
Här är ett exempel som frågar efter pagila exempeldatabas.
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
Och det här är vad jag får om jag kör det igen:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Om du har en stor tabell och du behöver returnera alla rader (eller många rader) kanske du vill ändra din fråga till något så här:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Skapa repeterbara slumptal
Postgres har också en setseed()
funktion som låter dig ställa in ett frö för efterföljande random()
samtal inom samma session.
Du kan använda setseed()
för att generera repeterbar random()
samtal.
Se hur Setseed() fungerar i Postgres för exempel.