Генерация случайного значения от 3 до 6 - PullRequest
89 голосов
/ 24 октября 2011

Возможно ли в Microsoft SQL Server генерировать случайное значение типа int от Min до Max (например, 3-9, 15-99 e.t.c)

Я знаю, я могу сгенерировать от 0 до Макса, но как увеличить минимальную границу?

Этот запрос генерирует случайное значение от 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

Ответы [ 10 ]

169 голосов
/ 23 августа 2013

Это генерирует случайное число в диапазоне 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 результатов (для имитации броска костей)
13 голосов
/ 24 октября 2011

Я вижу, вы добавили ответ на свой вопрос в SQL Server 2008, который вы также можете сделать

SELECT 3 + CRYPT_GEN_RANDOM(1) % 4 /*Random number between 3 and 6*/ 
FROM ...

Несколько недостатков этого метода:

  1. Это медленнеечем метод NEWID()
  2. Даже если он оценивается один раз в строке, оптимизатор запросов не осознает этого, что может привести к нечетным результатам .

, ноПросто подумал, что добавлю это как еще один вариант.

7 голосов
/ 24 октября 2011

Вы можете сделать это:

DECLARE @maxval TINYINT, @minval TINYINT
select @maxval=24,@minval=5

SELECT CAST(((@maxval + 1) - @minval) *
    RAND(CHECKSUM(NEWID())) + @minval AS TINYINT)

И это было взято непосредственно из этой ссылки , я действительно не знаю, как правильно оценить этот ответ.

5 голосов
/ 24 мая 2016

Красиво и просто, с сайта Пинала Дейва:

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.)

4 голосов
/ 15 декабря 2017

Вот простая и единственная строка кода

. Для этого используйте функцию 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

4 голосов
/ 26 апреля 2017

Просто:

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((@MAX-@MIN+1)*RAND(CONVERT(VARBINARY,NEWID()))); --And then this T-SQL snippet generates an integer between minimum and maximum integer values.

Вы можете изменить и отредактировать этот код для своих нужд.

1 голос
/ 06 ноября 2015
SELECT ROUND((6 - 3 * RAND()), 0)
0 голосов
/ 02 ноября 2018

В целом:

select rand()*(@upper-@lower)+@lower;

На ваш вопрос:

select rand()*(6-3)+3;

<=>

select rand()*3+3;
0 голосов
/ 07 декабря 2016
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
0 голосов
/ 21 июля 2016

Ответ Ламака как функция:

-- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...