PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como Random() funciona no PostgreSQL


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.