Генерация случайных чисел в SQL
Пересказ статьи Chad Callihan. Generating Random Numbers in SQL
Я редко использую случайные числа, поэтому, когда они требуются, мне приходится возвращаться и вспоминать. Возможно, написание поста на эту тему задержат их в моей памяти подольше.
Функция RAND
Первый способ сгенерировать случайное число - это использование функции RAND в SQL Server. Она возвращает значение типа float. Например:
Если вам нужно с помощью функции RAND получить число от 1 до 10 вместо значения float, вы можете использовать подобный запрос:
SELECT FLOOR(RAND()*(10))+1;
GO
Вы можете выполнить тесты, чтобы увидеть, каким может быть случайное распределение чисел. Попробуйте выполнить это и посмотреть, насколько случайны наши числа:
CREATE TABLE #RandomCheck (RandNum SMALLINT);
DECLARE @Num AS SMALLINT;
DECLARE @TestCount AS SMALLINT = 10000;
WHILE @TestCount > 0
BEGIN
SET @Num = (SELECT FLOOR(RAND() * (10)) + 1);
INSERT INTO #RandomCheck (RandNum)
VALUES (@Num);
SET @TestCount -= 1;
END
SELECT RandNum, count(*) AS 'Count'
FROM #RandomCheck
GROUP BY RandNum
ORDER BY RandNum;
В конечном итоге они распределяются довольно равномерно.
Функция NEWID
Другой функцией, которая используется для получения случайных чисел, является NEWID(). Если нам так же нужно случайное число между 1 и 10:
SELECT (ABS(CHECKSUM(NEWID())) % 10) + 1;
GO
Функция ABS() используется для получения абсолютного числа. Без нее числа в данном примере будут лежать в диапазоне между -8 и 10. Если подставить этот запрос в наш тестовый скрипт выше, мы получим подобные результаты:
Этот метод также дает довольно равномерное распределение.
Это способ, которым я получаю случайные числа. Если попытаетесь сделать что-то подобное для присвоения случайных номеров строкам в таблице, RAND сам по себе даст вам один и тот же номер для каждой строки. Вы должны быть осторожнее с такими сценариями.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой