使用 RAND

RAND 函數會計算從 0 到 1 的浮點亂數,並能選擇性地使用 tinyint、int 或 smallint 值,做為要計算的亂數的起始點。

下列範例會計算兩個亂數。第一個 RAND() 函數會讓 SQL Server 使用初始值 (Seed),第二個 RAND() 函數會使用數值 3 作為起始位置。

SELECT RAND(), RAND(3);

RAND 函數是一個虛擬亂數產生器,它的運作方式與 C 執行階段程式庫 rand 函數類似。如果未提供初始值 (Seed),系統會產生它自己的變數初始值。如果您以初始值來呼叫 RAND,則必須使用變數初始值來產生亂數。如果您以相同的初始值呼叫 RAND 多次,則它會傳回產生的同一個值。下列指令碼對於呼叫 RAND 會傳回相同的值,因為它們全都使用相同的初始值:

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

從 RAND 產生亂數的常見方法,就是將相關變數當作初始值,例如加入 GETDATE 的幾個部份:

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

當您使用以 GETDATE 為主的演算法來產生初始值時,如果在演算法中使用的最小日期部份之間隔內呼叫 RAND,則 RAND 仍會產生重複的值。尤其是將呼叫 RAND 包含在單一批次時,最可能發生這種情況。單一批次中對 RAND 的多次呼叫,可在同一毫秒中執行。毫秒是 DATEPART 最小的遞增值。在此狀況下,請使用非以時間為主的值來產生初始值。