RAND: примеры (SQL)

Генерация случайных чисел с помощью функции RAND в MS SQL
Раздел: Математические функции, Математические
RAND([seed]): float

Базовая информация о функции RAND

Функция RAND в MS SQL Server используется для генерации псевдослучайного числа с плавающей запятой в диапазоне от 0 до 1. Она применяется в ситуациях, когда требуется получить случайное значение, например, для выборки случайных записей, генерации тестовых данных, создания случайных сортировок или в алгоритмических расчетах.

Функция может быть вызвана с одним необязательным аргументом – seed (начальное значение). Если аргумент указан, он определяет начальное значение для генератора псевдослучайных чисел. Аргумент имеет целочисленный тип (integer).

Возвращаемое значение: функция возвращает значение типа float в диапазоне от 0 (включительно) до 1 (исключительно), то есть 0 <= значение < 1. Важной особенностью является то, что при одинаковом начальном значении (seed) функция будет возвращать идентичную последовательность чисел.

Если seed не указан, SQL Server присваивает системное начальное значение, и при каждом вызове в рамках одного соединения или запроса может генерироваться разная последовательность.

Базовые примеры использования

Простой вызов для получения случайного числа:

SELECT RAND() AS RandomNumber;
RandomNumber
0.488611148888489

Использование с начальным значением (seed) для воспроизводимости результата:

SELECT RAND(100) AS RandomNumberWithSeed;
RandomNumberWithSeed
0.715436657367485

Генерация случайного целого числа в заданном диапазоне (например, от 1 до 100):

SELECT FLOOR(RAND() * 100) + 1 AS RandomInt1_100;
RandomInt1_100
42

Похожие функции в MS SQL Server

В MS SQL Server существует несколько функций для работы со случайными значениями:

  • NEWID() – генерирует уникальный идентификатор (GUID), который можно использовать для случайной сортировки записей. Например: SELECT TOP 5 * FROM Products ORDER BY NEWID().
  • CRYPT_GEN_RANDOM() – возвращает криптографически стойкое случайное число в виде двоичного значения заданной длины. Эта функция предпочтительнее для задач, связанных с безопасностью.

RAND() чаще применяется для математических вычислений и генерации числовых данных, а NEWID() – для случайной выборки строк. CRYPT_GEN_RANDOM() используют в системах, где важна криптостойкость.

Типичные ошибки и особенности

1. Ожидание уникального случайного числа для каждой строки в одном запросе SELECT. RAND(), вызванная без seed в одном операторе, вычисляется один раз для всего оператора.

-- Неверное ожидание: разные числа для каждой строки
SELECT TOP 3 id, RAND() AS RandNum FROM sys.objects;
id  RandNum
5   0.45412345
6   0.45412345
7   0.45412345

2. Использование RAND() в выражении для вычисления столбца индексированного представления или детерминированного вычисления – приводит к ошибке, так как функция является недетерминированной.

3. Некорректное приведение типов при умножении на большое число, что может вызвать переполнение.

История изменений функции

Функция RAND() не претерпела значительных синтаксических изменений в последних версиях MS SQL Server (2012, 2014, 2016, 2017, 2019, 2022). Основное поведение и алгоритм генерации остаются стабильными для обеспечения обратной совместимости.

В новых версиях, однако, улучшена общая производительность и параллелизм выполнения запросов, что может косвенно влиять на порядок или скорость генерации последовательностей, особенно в сложных параллельных планах выполнения.

Рекомендуется учитывать, что конкретная реализация алгоритма генерации псевдослучайных чисел является внутренней особенностью SQL Server и может теоретически изменяться между основными версиями, хотя на практике это происходит крайне редко.

Расширенные примеры применения

Генерация случайной даты в определенном интервале:

Пример sql
DECLARE @StartDate DATE = '2023-01-01', @EndDate DATE = '2023-12-31';
SELECT DATEADD(DAY, RAND() * DATEDIFF(DAY, @StartDate, @EndDate), @StartDate) AS RandomDate;
RandomDate
2023-07-14

Использование в сочетании с CHECKSUM и NEWID для получения случайного числа на строку в запросе:

Пример sql
SELECT TOP 3 id, RAND(CHECKSUM(NEWID())) AS UniqueRandPerRow FROM sys.objects;
id  UniqueRandPerRow
5   0.873215
6   0.012547
7   0.654987

Создание детерминированной случайной последовательности для группировки записей (например, разбивка на 5 корзин):

Пример sql
SELECT id, NTILE(5) OVER (ORDER BY RAND(42)) AS RandomBucket FROM sys.objects WHERE type = 'U';
id  RandomBucket
...
(результат с постоянным распределением по корзинам при каждом запуске с seed=42)

Генерация случайной строки из набора символов:

Пример sql
DECLARE @chars NVARCHAR(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
SELECT SUBSTRING(@chars, CAST(RAND() * LEN(@chars) + 1 AS INT), 1) AS RandomChar;
RandomChar
'M'

Аналоги функции в других СУБД и языках

MySQL: функция RAND([seed]) аналогична SQL Server. Пример: SELECT RAND(), RAND(5);

PostgreSQL: функция RANDOM() (без параметров). Она возвращает значение в том же диапазоне. Пример: SELECT RANDOM(); Для seed используется SETSEED(value) отдельно.

Oracle: функция DBMS_RANDOM.VALUE (нижняя_граница, верхняя_граница). Без параметров возвращает число от 0 до 1. Пример: SELECT DBMS_RANDOM.VALUE FROM DUAL;

SQLite: встроенной функции RAND нет. Используется функция RANDOM(), возвращающая целое число между -9223372036854775808 и +9223372036854775807.

Sybase ASE: функция RAND([seed]) работает аналогично MS SQL.

MS SQL RAND function comments

En
RAND Returns a random float value from 0 through 1