In PostgreSQL is de random()
functie retourneert een pseudo-willekeurige waarde in het bereik 0.0 <=x <1.0.
Het maakt gebruik van een eenvoudig lineair congruentieel algoritme, dat een van de oudste en bekendste algoritmen voor het genereren van pseudo-willekeurige getallen is.
Een pseudo-willekeurig getal is een getal dat willekeurig lijkt, maar niet echt willekeurig is. Een pseudo-willekeurig getal is niet echt willekeurig omdat de waarde is gegenereerd door een bekende seed. Het lijkt echter willekeurig te zijn als de gebruiker geen kennis heeft van het zaad of het algoritme dat het heeft gemaakt.
Daarom worden pseudo-willekeurige getallen voor veel toepassingen vaak als goed genoeg beschouwd.
Voorbeeld
Hier is een voorbeeld van het genereren van een pseudo-willekeurig getal met de random()
functie.
SELECT random();
Resultaat:
0.625357600199532
Het resultaat zal natuurlijk elke keer dat je het aanroept anders zijn.
Hier is nog een voorbeeld waarbij ik de functie drie keer in dezelfde instructie aanroep.
SELECT
random(),
random(),
random();
Resultaat:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Willekeurig getal tussen 1 en 10
Hier is een voorbeeld van het genereren van een positief getal tussen 0 en 10.
SELECT random() * 10 + 1;
Resultaat:
4.564859004063727
Voor alle duidelijkheid:dit genereert een willekeurig getal dat>=1 en <10 is.
Willekeurig geheel getal
U kunt een functie gebruiken zoals trunc()
of floor()
om het willekeurige getal terug te geven als een geheel getal.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Resultaat:
trunc | floor -------+------- 1 | 8
Retourneer willekeurige rijen
U kunt random()
. gebruiken in een ORDER BY
clausule van een databasequery om willekeurige rijen te retourneren.
Hier is een voorbeeld dat de pagila . doorzoekt voorbeelddatabase.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Resultaat:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
En dit is wat ik krijg als ik het opnieuw doe:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Als je een grote tabel hebt en je moet alle rijen (of veel rijen) teruggeven, wil je misschien je zoekopdracht wijzigen in iets als dit:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Herhaalbare willekeurige getallen maken
Postgres heeft ook een setseed()
functie waarmee u een seed kunt instellen voor volgende random()
oproepen binnen dezelfde sessie.
U kunt setseed()
. gebruiken om herhaalbare random()
te genereren oproepen.
Zie Hoe Setseed() werkt in Postgres voor voorbeelden.