sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona Random() en PostgreSQL

En PostgreSQL, el random() La función devuelve un valor pseudoaleatorio en el rango 0.0 <=x <1.0.

Utiliza un algoritmo congruencial lineal simple, que es uno de los algoritmos generadores de números pseudoaleatorios más antiguos y conocidos.

Un número pseudoaleatorio es un número que parece ser aleatorio, pero no es realmente aleatorio. Un número pseudoaleatorio no es verdaderamente aleatorio porque su valor fue generado por una semilla conocida. Sin embargo, parecerá aleatorio si el usuario no conoce la semilla o el algoritmo que lo creó.

Por lo tanto, los números pseudoaleatorios a menudo se consideran lo suficientemente buenos para muchas aplicaciones.

Ejemplo

Aquí hay un ejemplo de cómo generar un número pseudoaleatorio con random() función.

SELECT random();

Resultado:

0.625357600199532

El resultado obviamente será diferente cada vez que lo llames.

Aquí hay otro ejemplo donde llamo a la función tres veces en la misma declaración.

SELECT 
  random(),
  random(),
  random();

Resultado:

 random            | random              | random
-------------------+---------------------+--------------------
 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314

Número aleatorio entre 1 y 10

Este es un ejemplo de cómo generar un número positivo entre 0 y 10.

SELECT random() * 10 + 1;

Resultado:

4.564859004063727

Para que quede claro, esto genera un número aleatorio que es>=1 y <10.

Entero aleatorio

Puede usar una función como trunc() o floor() para devolver el número aleatorio como un entero.

SELECT 
  trunc(random() * 10 + 1),
  floor(random() * 10 + 1);

Resultado:

 trunc | floor
-------+-------
     1 |     8

Devolver filas aleatorias

Puedes usar random() en un ORDER BY cláusula de una consulta de base de datos para devolver filas aleatorias.

Aquí hay un ejemplo que consulta la pagila base de datos de ejemplo.

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

Y esto es lo que obtengo si lo ejecuto de nuevo:

 film_id |       title        
---------+--------------------
     450 | IDOLS SNATCHERS
     827 | SPICE SORORITY
     593 | MONTEREY LABYRINTH
     529 | LONELY ELEPHANT
     591 | MONSOON CAUSE

Si tiene una tabla grande y necesita devolver todas las filas (o muchas filas), es posible que desee modificar su consulta a algo como esto:

SELECT *
FROM film 
WHERE film_id IN 
  (SELECT film_id FROM film ORDER BY random() LIMIT 5);

Crea números aleatorios repetibles

Postgres también tiene un setseed() función que le permite establecer una semilla para posteriores random() llamadas dentro de la misma sesión.

Puedes usar setseed() para generar random() repetibles llamadas.

Consulte Cómo funciona Setseed() en Postgres para ver ejemplos.