No PostgreSQL, o
random()
A função retorna um valor pseudo-aleatório no intervalo 0,0 <=x <1,0. Ele usa um algoritmo congruente linear simples, que é um dos algoritmos geradores de números pseudo-aleatórios mais antigos e mais conhecidos.
Um número pseudo-aleatório é um número que parece ser aleatório, mas não é verdadeiramente aleatório. Um número pseudo-aleatório não é verdadeiramente aleatório porque seu valor foi gerado por uma semente conhecida. No entanto, parecerá aleatório se o usuário não tiver conhecimento da semente ou do algoritmo que o criou.
Portanto, números pseudo-aleatórios geralmente são considerados bons o suficiente para muitas aplicações.
Exemplo
Aqui está um exemplo de geração de um número pseudo-aleatório com o
random()
função. SELECT random();
Resultado:
0.625357600199532
O resultado obviamente será diferente cada vez que você o chamar.
Aqui está outro exemplo em que chamo a função três vezes na mesma instrução.
SELECT
random(),
random(),
random();
Resultado:
random | random | random -------------------+---------------------+-------------------- 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314
Número aleatório entre 1 e 10
Aqui está um exemplo de geração de um número positivo entre 0 e 10.
SELECT random() * 10 + 1;
Resultado:
4.564859004063727
Só para ficar claro, isso gera um número aleatório que é>=1 e <10.
Inteiro aleatório
Você pode usar uma função como
trunc()
ou floor()
para retornar o número aleatório como um inteiro. SELECT
trunc(random() * 10 + 1),
floor(random() * 10 + 1);
Resultado:
trunc | floor -------+------- 1 | 8
Retornar linhas aleatórias
Você pode usar
random()
em um ORDER BY
cláusula de uma consulta de banco de dados para retornar linhas aleatórias. Aqui está um exemplo que consulta a pagila banco de dados de exemplo.
SELECT
film_id,
title
FROM film
ORDER BY random() LIMIT 5;
Resultado:
film_id | title ---------+--------------------- 116 | CANDIDATE PERDITION 806 | SLEEPY JAPANESE 892 | TITANIC BOONDOCK 826 | SPEED SUIT 612 | MUSSOLINI SPOILERS
E aqui está o que eu recebo se eu executá-lo novamente:
film_id | title ---------+-------------------- 450 | IDOLS SNATCHERS 827 | SPICE SORORITY 593 | MONTEREY LABYRINTH 529 | LONELY ELEPHANT 591 | MONSOON CAUSE
Se você tiver uma tabela grande e precisar retornar todas as linhas (ou muitas linhas), poderá modificar sua consulta para algo assim:
SELECT *
FROM film
WHERE film_id IN
(SELECT film_id FROM film ORDER BY random() LIMIT 5);
Criar números aleatórios repetíveis
Postgres também tem um
setseed()
função que permite definir uma semente para random()
subsequentes chamadas na mesma sessão. Você pode usar
setseed()
para gerar random()
repetível chamadas. Veja como Setseed() funciona no Postgres para exemplos.