MariaDB zawiera RAND()
funkcja zwracająca liczbę losową. Dokładniej, zwraca DOUBLE
precyzyjna wartość zmiennoprzecinkowa v
w zakresie 0 <= v < 1.0
.
To świetnie, ale co zrobić, jeśli chcesz wygenerować liczbę całkowitą z większego zakresu – i z zakresu, który określisz?
Na szczęście istnieje prosta technika, aby to zrobić.
Technika
Kluczem do zwracania losowej liczby całkowitej w określonym zakresie jest następująca składnia:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Używa FLOOR()
funkcja zwracająca największą liczbę całkowitą nie większą niż jej argument. Widząc, jak nasza RAND()
Funkcja jest częścią argumentu, wszystko, co musimy zrobić, to zastosować kilka dodatkowych obliczeń, aby określić nasze wymagane minimalne i maksymalne wartości losowe.
Wygeneruj losową liczbę całkowitą od 1 do 10
Tak więc, używając powyższej składni, oto przykład generowania losowej liczby całkowitej od 1 do 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Wynik:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 7 | +---------------------------------+
Nazwijmy to trochę bardziej, aby zobaczyć efekt losowy:
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;
Wynik:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Wygeneruj losową liczbę całkowitą od 1 do 100
Aby wygenerować losową liczbę od 1 do 100, wystarczy, że zamienimy 10 na 100:
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Wynik:
+----------------------------------+ | FLOOR(1 + RAND() * (100 - 1 +1)) | +----------------------------------+ | 87 | +----------------------------------+
Nazwijmy to trochę bardziej, aby zobaczyć efekt losowy:
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;
Wynik:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 61 | 45 | 41 | 68 | 19 | 92 | 99 | 18 | +----+----+----+----+----+----+----+----+
Wygeneruj losową liczbę całkowitą między 10000 a 50000
Zróbmy jeszcze jedno, tym razem generując losową liczbę od 10000 do 50000:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Wynik:
+--------------------------------------------+ | FLOOR(10000 + RAND() * (50000 - 10000 +1)) | +--------------------------------------------+ | 46884 | +--------------------------------------------+
I jeszcze kilka połączeń, aby zobaczyć efekt losowy:
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;
Wynik:
+-------+-------+-------+-------+-------+-------+-------+-------+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +-------+-------+-------+-------+-------+-------+-------+-------+ | 13688 | 37790 | 17884 | 46052 | 46608 | 44880 | 34578 | 28249 | +-------+-------+-------+-------+-------+-------+-------+-------+