MariaDB innehåller en RAND()
funktion som returnerar ett slumptal. Mer exakt returnerar den en DOUBLE
precisionsflyttalsvärde v
i intervallet 0 <= v < 1.0
.
Det här är bra, men vad händer om du vill generera ett heltal inom ett större intervall – och ett intervall som du anger?
Lyckligtvis finns det en enkel teknik för att göra detta.
Tekniken
Nyckeln för att returnera ett slumpmässigt heltal inom ett specifikt intervall är i följande syntax:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Detta använder FLOOR()
funktion för att returnera det största heltalsvärdet som inte är större än dess argument. Som vår RAND()
funktion är en del av argumentet, allt vi behöver göra är att tillämpa några fler beräkningar för att specificera våra erforderliga lägsta och högsta slumpmässiga värden.
Generera ett slumpmässigt heltal mellan 1 och 10
Så, med ovanstående syntax, här är ett exempel på att generera ett slumpmässigt heltal mellan 1 och 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Resultat:
+--------------------------------+| FLOOR(1 + RAND() * (10 - 1 +1)) |+-------------------------------- -+| 7 |+----------------------------------------+
Låt oss kalla det lite mer för att se den slumpmässiga effekten:
SELECT
FLOOR(1 + RAND() * (10 - 1 +1)) AS r1,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r2,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r3,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r4,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r5,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r6,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r7,
FLOOR(1 + RAND() * (10 - 1 +1)) AS r8;
Resultat:
+----+----+----+----+----+-----+----+----+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+----+----+----+----+----+----+----+----+| 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 |+----+----+----+----+----+-----+-----+----+
Generera ett slumpmässigt heltal mellan 1 och 100
För att generera ett slumptal mellan 1 och 100 behöver vi bara ersätta 10 med 100:
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Resultat:
+------------------------------------------+| FLOOR(1 + RAND() * (100 - 1 +1)) |+-------------------------------- --+| 87 |+------------------------------------------+
Låt oss kalla det lite mer för att se den slumpmässiga effekten:
SELECT
FLOOR(1 + RAND() * (100 - 1 +1)) AS r1,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r2,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r3,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r4,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r5,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r6,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r7,
FLOOR(1 + RAND() * (100 - 1 +1)) AS r8;
Resultat:
+----+----+----+----+----+-----+----+----+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+----+----+----+----+----+----+----+----+| 61 | 45 | 41 | 68 | 19 | 92 | 99 | 18 |+----+----+----+----+----+-----+----+----+
Generera ett slumpmässigt heltal mellan 10000 och 50000
Låt oss göra en till, den här gången genererar ett slumptal mellan 10 000 och 50 000:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Resultat:
+----------------------------------------------------+| FLOOR(10000 + RAND() * (50000 - 10000 +1)) |+-------------------------------- ------------+| 46884 |+----------------------------------------------------+Och några fler samtal för att se den slumpmässiga effekten:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r1, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r2, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r3, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r4, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r5, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r6, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r7, FLOOR(10000 + RAND() * (50000 - 10000 +1)) AS r8;
Resultat:
+-------+-------+-------+--------+-------+------ -+-------+-------+| r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 |+-------+-------+-------+-------+-------+------ +-------+-------+| 13688 | 37790 | 17884 | 46052 | 46608 | 44880 | 34578 | 28249 |+-------+-------+-------+-------+-------+------ +-------+-------+