В PostgreSQL, random()
функцията връща псевдослучайна стойност в диапазона 0,0 <=x <1,0.
Той използва прост линеен конгруентен алгоритъм, който е един от най-старите и най-известни алгоритми за генериране на псевдослучайни числа.
Псевдослучайно число е число, което изглежда случайно, но не е наистина случайно. Псевдослучайното число не е наистина случайно, защото стойността му е генерирана от известно начало. Въпреки това ще изглежда произволно, ако потребителят няма познания за семето или алгоритъма, който го е създал.
Следователно псевдослучайните числа често се считат за достатъчно добри за много приложения.
Пример
Ето пример за генериране на псевдослучайно число с random()
функция.
SELECT random();
Резултат:
0.625357600199532
Резултатът очевидно ще бъде различен всеки път, когато го извикате.
Ето още един пример, в който извиквам функцията три пъти в едно и също изявление.
SELECT
random(),
random(),
random();
Резултат:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Произволно число между 1 и 10
Ето пример за генериране на положително число между 0 и 10.
SELECT random() * 10 + 1;
Резултат:
4.564859004063727
Само за да е ясно, това генерира произволно число, което е>=1 и <10.
Случайно цяло число
Можете да използвате функция като trunc()
или floor()
за да върнете произволното число като цяло число.
SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Резултат:
trunc | floor -------+------- 1 | 8
Връщане на произволни редове
Можете да използвате random()
в ORDER BY
клауза на заявка към база данни за връщане на произволни редове.
Ето пример, който прави заявки за pagila примерна база данни.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Резултат:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
И ето какво получавам, ако го стартирам отново:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Ако имате голяма таблица и трябва да върнете всички редове (или много редове), може да искате да промените заявката си до нещо подобно:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Създаване на повтарящи се произволни числа
Postgres също има setseed()
функция, която ви позволява да зададете начало за последващи random()
обаждания в рамките на същата сесия.
Можете да използвате setseed()
за генериране на повторяем random()
обаждания.
Вижте как Setseed() работи в Postgres за примери.