Использование функции RAND
Функция RAND вычисляет случайную величину с плавающей запятой и может при необходимости вычисления использовать значения типа tinyint, int или smallint в качестве начального значения.
В следующем примере вычисляется пара случайных чисел. С помощью первой функции RAND()
SQL Server 2005 получает значение, инициирующее генератор случайных чисел, а вторая функция RAND()
использует значение 3
в качестве начального.
SELECT RAND(), RAND(3)
Функция RAND — это генератор псевдослучайных чисел, который работает аналогично функции rand из библиотеки С. Если начального значения нет, система создает свои собственные переменные начальные значения. При вызове функции 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 содержатся в одном пакете. Такие вызовы могут выполняться в течение одной миллисекунды. Это наименьшее приращение DATEPART. В подобных случаях для формирования начального значения следует использовать величину, основанную на чем-то, отличном от времени.
См. также
Другие ресурсы
RAND (Transact-SQL)
Математические функции (Transact-SQL)