MariaDB include un RAND()
funzione che restituisce un numero casuale. Più precisamente, restituisce un DOUBLE
valore in virgola mobile di precisione v
nell'intervallo 0 <= v < 1.0
.
Questo è fantastico, ma cosa succede se vuoi generare un numero intero all'interno di un intervallo più ampio e un intervallo che specifichi?
Fortunatamente, esiste una tecnica semplice per farlo.
La Tecnica
La chiave che restituisce un numero intero casuale all'interno di un intervallo specifico è nella seguente sintassi:
FLOOR(min_value + RAND() * (max_value - min_value +1))
Questo utilizza il FLOOR()
funzione per restituire il valore intero più grande non maggiore del suo argomento. Visto come il nostro RAND()
funzione fa parte dell'argomento, tutto ciò che dobbiamo fare è applicare qualche altro calcolo per specificare i nostri valori casuali minimi e massimi richiesti.
Genera un numero intero casuale compreso tra 1 e 10
Quindi, usando la sintassi sopra, ecco un esempio di generazione di un numero intero casuale compreso tra 1 e 10:
SELECT FLOOR(1 + RAND() * (10 - 1 +1));
Risultato:
+---------------------------------+ | FLOOR(1 + RAND() * (10 - 1 +1)) | +---------------------------------+ | 7 | +---------------------------------+
Chiamiamolo ancora un po' per vedere l'effetto casuale:
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;
Risultato:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 3 | 6 | 10 | 4 | 6 | 10 | 1 | 6 | +----+----+----+----+----+----+----+----+
Genera un numero intero casuale compreso tra 1 e 100
Per generare un numero casuale compreso tra 1 e 100, tutto ciò che dobbiamo fare è sostituire 10 con 100:
SELECT FLOOR(1 + RAND() * (100 - 1 +1));
Risultato:
+----------------------------------+ | FLOOR(1 + RAND() * (100 - 1 +1)) | +----------------------------------+ | 87 | +----------------------------------+
Chiamiamolo ancora un po' per vedere l'effetto casuale:
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;
Risultato:
+----+----+----+----+----+----+----+----+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +----+----+----+----+----+----+----+----+ | 61 | 45 | 41 | 68 | 19 | 92 | 99 | 18 | +----+----+----+----+----+----+----+----+
Genera un numero intero casuale compreso tra 10000 e 50000
Facciamone un altro, questa volta generando un numero casuale compreso tra 10000 e 50000:
SELECT FLOOR(10000 + RAND() * (50000 - 10000 +1));
Risultato:
+--------------------------------------------+ | FLOOR(10000 + RAND() * (50000 - 10000 +1)) | +--------------------------------------------+ | 46884 | +--------------------------------------------+
E altre chiamate per vedere l'effetto casuale:
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;
Risultato:
+-------+-------+-------+-------+-------+-------+-------+-------+ | r1 | r2 | r3 | r4 | r5 | r6 | r7 | r8 | +-------+-------+-------+-------+-------+-------+-------+-------+ | 13688 | 37790 | 17884 | 46052 | 46608 | 44880 | 34578 | 28249 | +-------+-------+-------+-------+-------+-------+-------+-------+