sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur Random() fungerar i PostgreSQL

I PostgreSQL, random() funktion returnerar ett pseudoslumpmässigt värde i intervallet 0,0 <=x <1,0.

Den använder en enkel linjär kongruentialalgoritm, som är en av de äldsta och mest kända genereringsalgoritmerna för pseudoslumptal.

Ett pseudoslumptal är ett tal som verkar vara slumpmässigt, men som inte är riktigt slumpmässigt. Ett pseudoslumptal är inte riktigt slumpmässigt eftersom dess värde genererades av ett känt frö. Det kommer dock att verka slumpmässigt om användaren inte har någon kunskap om fröet eller algoritmen som skapade det.

Därför anses pseudoslumptal ofta vara tillräckligt bra för många tillämpningar.

Exempel

Här är ett exempel på att generera ett pseudoslumptal med random() funktion.

SELECT random();

Resultat:

0.625357600199532

Resultatet blir uppenbarligen olika varje gång du ringer det.

Här är ett annat exempel där jag anropar funktionen tre gånger i samma programsats.

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

Resultat:

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

Slumptal mellan 1 och 10

Här är ett exempel på att generera ett positivt tal mellan 0 och 10.

SELECT random() * 10 + 1;

Resultat:

4.564859004063727

Bara för att vara tydlig genererar detta ett slumptal som är>=1 och <10.

Slumpmässigt heltal

Du kan använda en funktion som trunc() eller floor() för att returnera slumptalet som ett heltal.

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

Resultat:

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

Returnera slumpmässiga rader

Du kan använda random() i en ORDER BY sats i en databasfråga för att returnera slumpmässiga rader.

Här är ett exempel som frågar efter pagila exempeldatabas.

SELECT 
  film_id,
  title
FROM film 
ORDER BY random() LIMIT 5;

Resultat:

 film_id |        title        
---------+---------------------
     116 | CANDIDATE PERDITION
     806 | SLEEPY JAPANESE
     892 | TITANIC BOONDOCK
     826 | SPEED SUIT
     612 | MUSSOLINI SPOILERS

Och det här är vad jag får om jag kör det igen:

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

Om du har en stor tabell och du behöver returnera alla rader (eller många rader) kanske du vill ändra din fråga till något så här:

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

Skapa repeterbara slumptal

Postgres har också en setseed() funktion som låter dig ställa in ett frö för efterföljande random() samtal inom samma session.

Du kan använda setseed() för att generera repeterbar random() samtal.

Se hur Setseed() fungerar i Postgres för exempel.


  1. Fler showplanförbättringar? Ja tack!

  2. Databashörna:Nybörjarguide till Mysql-lagringsmotorer

  3. Hur implementerar man en-till-en-, en-till-många- och många-till-många-relationer samtidigt som man designar tabeller?

  4. Utmaningslösningar för nummerseriegenerator – del 4