Skip to content

Генерация случайных чисел в 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 сам по себе даст вам один и тот же номер для каждой строки. Вы должны быть осторожнее с такими сценариями.

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

The author does not allow comments to this entry

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Submitted comments will be subject to moderation before being displayed.