RAND: примеры (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 и может теоретически изменяться между основными версиями, хотя на практике это происходит крайне редко.
Расширенные примеры применения
Генерация случайной даты в определенном интервале:
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 для получения случайного числа на строку в запросе:
SELECT TOP 3 id, RAND(CHECKSUM(NEWID())) AS UniqueRandPerRow FROM sys.objects;id UniqueRandPerRow 5 0.873215 6 0.012547 7 0.654987
Создание детерминированной случайной последовательности для группировки записей (например, разбивка на 5 корзин):
SELECT id, NTILE(5) OVER (ORDER BY RAND(42)) AS RandomBucket FROM sys.objects WHERE type = 'U';id RandomBucket ... (результат с постоянным распределением по корзинам при каждом запуске с seed=42)
Генерация случайной строки из набора символов:
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.