Сгенерировать случайное значение int от 3 до 6
Возможно ли в Microsoft SQL Server генерировать случайное значение int от Min до Max (пример 3-9, 15-99 e.t.c)
Я знаю, я могу генерировать от 0 до Max, но как увеличить Min border?
Этот запрос генерирует случайное значение от 1 до 6. Необходимо изменить его с 3 до 6.
SELECT table_name, 1.0 + floor(6 * RAND(convert(varbinary, newid()))) magic_number
FROM information_schema.tables
Добавлено через 5 секунд:
Глупый вопрос, извините...
SELECT table_name, 3.0 + floor(4 * RAND(convert(varbinary, newid()))) magic_number
FROM information_schema.tables
Ответы
Ответ 1
Это генерирует случайное число от 0 до 9
ABS(CHECKSUM(NEWID()) % 10)
С 1 по 6
ABS(CHECKSUM(NEWID()) % 6) + 1
С 3 по 6
ABS(CHECKSUM(NEWID()) % 4) + 3
Динамический (на основе комментария Эйлерта Хельмесетса)
ABS (CHECKSUM (NEWID())% (@max - @min + 1)) + @min
Обновлено на основе комментариев:
-
NEWID
генерирует случайную строку (для каждой строки в ответ) -
CHECKSUM
принимает значение строки и создает число - модуль (
%
) делит на это число и возвращает остаток (то есть максимальное значение на единицу меньше, чем число, которое вы используете) -
ABS
меняет отрицательные результаты на положительные - затем добавьте один к результату, чтобы исключить 0 результатов (для имитации броска костей)
Ответ 2
Я вижу, что вы добавили ответ на свой вопрос в SQL Server 2008, вы также можете сделать
SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/
FROM ...
Несколько недостатков этого метода:
но просто подумал, что добавлю его как еще один вариант.
Ответ 3
Вы можете сделать это:
DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5
SELECT CAST(((@maxval + 1) - @minval) *
RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)
И это было взято непосредственно из этой ссылки, я действительно не знаю, как правильно отнестись к этому ответу.
Ответ 4
Приятный и простой, с сайта Pinal Dave:
http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/
DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT
SET @Lower = 3 ---- The lowest random number
SET @Upper = 7 ---- One more than the highest random number
SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0)
SELECT @Random
(Я сделал небольшое изменение в @Upper-, чтобы включить верхнее число, добавлено 1.)
Ответ 5
Просто:
DECLARE @MIN INT=3; --We define minimum value, it can be generated.
DECLARE @MAX INT=6; --We define maximum value, it can be generated.
SELECT @MIN+FLOOR((@[email protected]+1)*RAND(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.
Вы можете изменить и отредактировать этот код для своих нужд.
Ответ 6
Вот простая и единственная строка кода
Для этого используйте функцию SQL Inbuild RAND().
Вот формула для генерации случайного числа между двумя номерами (RETURN INT Range)
Здесь a - ваш первый номер (мин.), а b - второе число (Макс.) в диапазоне
SELECT FLOOR(RAND()*(b-a)+a)
Примечание. Вы можете использовать функцию CAST или CONVERT, чтобы получить номер диапазона INT.
(CAST (RAND() * (25-10) +10 AS INT))
Пример:
SELECT FLOOR(RAND()*(25-10)+10);
Вот формула для генерации случайного числа между двумя номерами (RETURN DECIMAL Range)
SELECT RAND()*(b-a)+a;
Пример:
SELECT RAND()*(25-10)+10;
Подробнее проверьте это: https://www.techonthenet.com/sql_server/functions/rand.php
Ответ 7
SELECT ROUND((6 - 3 * RAND()), 0)
Ответ 8
Ответ Lamak как функция:
-- Create RANDBETWEEN function
-- Usage: SELECT dbo.RANDBETWEEN(0,9,RAND(CHECKSUM(NEWID())))
CREATE FUNCTION dbo.RANDBETWEEN(@minval TINYINT, @maxval TINYINT, @random NUMERIC(18,10))
RETURNS TINYINT
AS
BEGIN
RETURN (SELECT CAST(((@maxval + 1) - @minval) * @random + @minval AS TINYINT))
END
GO
Ответ 9
DECLARE @min INT = 3;
DECLARE @max INT = 6;
SELECT @min + ROUND(RAND() * (@max - @min), 0);
Шаг за шагом
DECLARE @min INT = 3;
DECLARE @max INT = 6;
DECLARE @rand DECIMAL(19,4) = RAND();
DECLARE @difference INT = @max - @min;
DECLARE @chunk INT = ROUND(@rand * @difference, 0);
DECLARE @result INT = @min + @chunk;
SELECT @result;
Обратите внимание, что пользовательская функция, таким образом, не позволяет использовать RAND(). Обходной путь для этого (источник: http://blog.sqlauthority.com/2012/11/20/sql-server-using-rand-in-user-defined-functions-udf/) состоит в том, чтобы сначала создать представление.
CREATE VIEW [dbo].[vw_RandomSeed]
AS
SELECT RAND() AS seed
а затем создайте случайную функцию
CREATE FUNCTION udf_RandomNumberBetween
(
@min INT,
@max INT
)
RETURNS INT
AS
BEGIN
RETURN @min + ROUND((SELECT TOP 1 seed FROM vw_RandomSeed) * (@max - @min), 0);
END
Ответ 10
В общем:
select rand()*(@[email protected])[email protected];
На ваш вопрос:
select rand()*(6-3)+3;
<=>
select rand()*3+3;