mercoledì 18 marzo 2009

MySQL: Generare numeri casuali in un intervallo

L'altro giorno mi sono imbattuto nella necessità di rielaborare dei dati creando un dataset simile ma rielaborando secondo funzioni statistiche dei campi numerici.

Avendo precedentemente calcolato Media e Varianza di questo set di dati (funzioni AVG() e STD()) quello che si desiderava fare era:
Media + (NumeroRandom * Varianza)
così facendo si sarebbe lavorato sulla media dei valori aggiungendogli una deviazione fornita dal numero randomico (compreso tra -0,8 e 0,8) moltiplicato la varianza.

L'inica funzione MySQL che genera numeri casuali è RAND(), però questa funzione produce numeri in virgola mobile compresi tra 0 e 1.
La sola funzione non riusciva a risolvere la problematica, quindi andava ulteriormente elaborata.
Googlando ho trovato per ottenere un numero intero variabile in un intervallo, mettiamo 1 e 3, si può applicare la seguente formula dove 1=i e 3=j:
FLOOR(i + RAND() * (j – i))
La formula di venta:
FLOOR(1 + RAND() * 2)
A questo punto non è stato necessario altro che effettuare una sostituzione per ottenere la formula finale dell'intervallo a cui ero interessato:
CEILING(Media + (-0.8 + (RAND() * 1.6)) * Varianza)
Ho usato il CEILING() in quanto a mi serviva arrotondare all'intero superiore contrariamente al FLOOR().
Spero che questo piccolo promemoria possa essere utile ad altri. Continuate a seguirmi.

Wsc

Nessun commento: