3에서 6까지 임의의 정수 값 생성


101

Microsoft SQL Server에서 Min에서 Max까지 임의의 int 값을 생성 할 수 있습니까 (예 : 3-9 개, 15-99 등)

알아요, 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

1
거기에있는 대답은 테이블에 대한 관리자 유형 권한이있는 경우에만 작동합니다. 이 문제를 해결 한 방법은 필드의 기본 키를 시드로 사용하는 것입니다. 배포는 훌륭하지는 않았지만 목적을 달성했습니다.
Shadow

답변:


196

이것은 0-9 사이의 임의의 숫자를 생성합니다

SELECT ABS(CHECKSUM(NEWID()) % 10)

1 ~ 6

SELECT ABS(CHECKSUM(NEWID()) % 6) + 1

3 ~ 6

SELECT ABS(CHECKSUM(NEWID()) % 4) + 3

동적 (Eilert Hjelmeseths 주석 기반)

SELECT ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min

댓글에 따라 업데이트 됨 :

  • NEWID 임의의 문자열 생성 (반환되는 각 행에 대해)
  • CHECKSUM 문자열 값을 취하고 숫자를 생성
  • 모듈러스 ( %)는 해당 숫자로 나누고 나머지를 반환합니다 (즉, 최대 값은 사용하는 숫자보다 하나 적음).
  • ABS 부정적인 결과를 긍정적으로 변경
  • 그런 다음 결과에 하나를 추가하여 0 개의 결과를 제거합니다 (주사위 굴림 시뮬레이션).

2
이것은 나에게 많은 도움이되었습니다! 대량 삽입을 위해 임의의 키를 생성하려는 경우 중복이 발생할 수 있고 일부 명령문이 실패 할 수 있음을 기억하십시오. 하지만 감사합니다!
Niklas

3
1에서 27 사이의 난수를 생성해야하는 경우 어떻게합니까? 즉, 9보다 큰 범위?
somegeek

4
논리를 따르는 경우이 조정을 통해 범위를 쉽게 동적으로 설정할 수 있습니다. ABS(CHECKSUM(NEWID()) % (@max - @min + 1)) + @min. 내 부분에 대한 몇 가지 테스트를 통해 좋은 결과를 얻었습니다. 실제로 정확하다면이 답변을 포함하여 약간 개선 될 수 있다고 생각합니다.
EILERT Hjelmeseth

13

SQL Server 2008에서 질문에 대한 답변을 추가 한 것을 확인했습니다.

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

이 방법의 몇 가지 단점은 다음과 같습니다.

  1. 이것은 NEWID() 방법
  2. 행당 한 번 평가 되더라도 쿼리 최적화 프로그램은 이상한 결과를 초래할 수있는 이를 인식하지 못합니다 .

그러나 다른 옵션으로 추가 할 것이라고 생각했습니다.


1
@ FSou1-예. 나는 CRYPT_GEN_RANDOM더 암호 학적으로 안전한 의사 난수가 필요한 상황을위한 것이라고 생각 합니다.
Martin Smith

7

다음과 같이 할 수 있습니다.

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

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

그리고 그것은 이 링크 에서 직접 가져온 것이므로이 답변에 대해 적절한 크레딧을 제공하는 방법을 정말로 모릅니다.


5

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

(1을 더한 상위 숫자를 포함하도록 @ Upper-를 약간 변경했습니다.)


다른 게시물에서이 예를 보았습니다. 무작위 분포를 제공하지 않습니다. 예를 들어 Lower는 1이고 Upper는 11이므로 1에서 10까지의 난수를 원합니다. 1과 10은 발생 횟수의 절반을 2-8로 얻습니다. 가서 테스트 해보세요.
nanonerd

4

간단히:

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
이 코드는 환영과 도움을 제공하는 동안, 그것은 것입니다 그것이 설명을 포함하면 크게 개선방법 이 문제를 해결합니다. 그것 없이는 귀하의 답변은 교육적 가치가 훨씬 떨어집니다. 지금 묻는 사람뿐만 아니라 미래에 독자를위한 질문에 답변하고 있다는 것을 기억하십시오! 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Toby Speight

4

다음은 간단하고 한 줄의 코드입니다.

이를 위해 SQL Inbuild RAND () 함수를 사용하십시오.

다음은 두 숫자 사이에서 난수를 생성하는 공식입니다 (RETURN INT 범위).

여기서 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 범위).

SELECT RAND()*(b-a)+a;

예:

SELECT RAND()*(25-10)+10;

자세한 내용은 https://www.techonthenet.com/sql_server/functions/rand.php를 확인하십시오.


1
링크 된 기사에서 언급했듯이 이것은 실제로 값 = Max를 생성하지 않습니다. 예를 들어 값> = 10 및 <= 25에 대해 이렇게하려면 SELECT FLOOR (RAND () * (25-10 + 1)) + 10
Shaun

1
SELECT ROUND((6 - 3 * RAND()), 0)

2
하나의 숫자를 다른 숫자보다 얻을 수있는 기회는 똑같이 분산되지 않습니다. 출력 확인 : SELECT ROUND((6 - 3 * 0.16), 0) SELECT ROUND((6 - 3 * 0.17), 0) SELECT ROUND((6 - 3 * 0.5), 0) SELECT ROUND((6 - 3 * 0.51), 0) SELECT ROUND((6 - 3 * 0.83), 0) SELECT ROUND((6 - 3 * 0.84), 0) 6에 대한 16 % 변화, ~ 34 % 5, ~ 34 % 4 및 ~ 16 % 3입니다.
Mike de Klerk 2016

자르기가 반올림보다 우수합니다.
MichaelChirico

0

라막함수로서의 대답 :

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

0
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

일반적으로 :

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

질문 :

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

<=>

select rand()*3+3;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.