Utilizzo di RAND

La funzione RAND consente di calcolare un numero a virgola mobile casuale compreso tra 0 e 1. Per questa funzione è possibile specificare un valore tinyint, int o smallint come punto iniziale del numero casuale da calcolare.

Nell'esempio seguente vengono calcolati due numeri casuali. La prima funzione RAND() consente a SQL Server di selezionare il valore di inizializzazione, mentre la seconda funzione RAND() utilizza il valore 3 come posizione di inizio.

SELECT RAND(), RAND(3);

La funzione RAND è un generatore di numeri pseudocasuali che funziona in modo simile alla funzione rand della libreria runtime di C. Se non viene specificato alcun valore di inizializzazione, tramite il sistema vengono generati numeri di inizializzazione variabili. Se si chiama la funzione RAND con un determinato valore di inizializzazione, per generare numeri casuali è necessario utilizzare valori di inizializzazione variabili. Se si chiama più volte la funzione RAND con lo stesso valore di inizializzazione, verrà restituito lo stesso valore generato. Lo script seguente restituisce lo stesso valore per le chiamate alla funzione RAND, in quanto a ogni esecuzione viene utilizzato lo stesso valore di inizializzazione:

SELECT RAND(159784);
SELECT RAND(159784);
SELECT RAND(159784);

Per generare numeri casuali tramite la funzione RAND, è consigliabile specificare come valori di inizializzazione valori relativamente variabili, ad esempio aggiungendo diverse parti di GETDATE:

SELECT RAND( (DATEPART(mm, GETDATE()) * 100000 )
           + (DATEPART(ss, GETDATE()) * 1000 )
           + DATEPART(ms, GETDATE()) );

Se per la generazione dei valori di inizializzazione viene utilizzato un algoritmo basato su GETDATE, tramite la funzione RAND possono comunque venire generati valori duplicati se le chiamate alla funzione vengono eseguite entro l'intervallo DATEPART più piccolo utilizzato nell'algoritmo. Ciò si verifica soprattutto quando le chiamate alla funzione RAND sono incluse in un unico batch. È possibile eseguire più chiamate alla funzione RAND dallo stesso batch nell'arco di un millisecondo. Tale intervallo rappresenta l'incremento più piccolo di DATEPART. In questo caso, per generare i valori di inizializzazione, è consigliabile specificare un valore non basato sull'ora.