programing

3에서 6 사이의 랜덤 int 값 생성

subpage 2023. 5. 14. 10:41
반응형

3에서 6 사이의 랜덤 int 값 생성

Microsoft SQL Server에서 최소값에서 최대값까지 임의의 int 값을 생성할 수 있습니까(3-9 예제, 15-99 e.t.c).

알아요, 0부터 최대까지 생성할 수 있는데, Min 테두리를 어떻게 늘립니까?

이 쿼리는 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

유용한 편집자가 각 문 앞에 'Select'를 추가했지만, 이 항목의 요점은 하나의 항목만이 아니라 각 행에 대한 고유한 키를 반환으로 생성할 수 있다는 것입니다(이를 위해 Rand() 함수를 사용합니다).예:tblExample에서 상위 100 랜드(),* 선택

모든 100개 행에 대해 동일한 랜덤 값을 반환합니다.

한편: tble 예제에서 상위 100개 ABS(CHECKSUM(NEWID()) %10)를 선택하십시오(*).

반환되는 각 행에서 0과 9 사이의 다른 랜덤 값을 반환합니다.따라서 선택하면 복사 및 붙여넣기가 쉬워지지만 필요한 경우 논리를 선택 문에 복사할 수 있습니다.

0-9 사이의 난수가 생성됩니다.

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

1 ~ 6

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

3 ~ 6

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

Dynamic (Eilert Hjelmesh Comment 기반 - 시각적 프레젠테이션을 제공해 준 jiraiya 덕분)

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

주석을 기반으로 업데이트됨:

  • NEWID임의 문자열을 생성합니다(반복하는 각 행에 대해).
  • CHECKSUM문자열 값을 사용하여 숫자를 만듭니다.
  • 계수(%) 해당 숫자로 나누고 나머지를 반환합니다(최대 값이 사용하는 숫자보다 1 더 작음).
  • ABS부정적인 결과를 긍정적인 결과로 변경
  • 그런 다음 결과에 하나를 추가하여 0개의 결과를 제거합니다(다이스 롤 시뮬레이션).

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

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

이 방법의 몇 가지 단점은

  1. 이것은 그것보다 느립니다.NEWID()방법
  2. 행당 한 번씩 평가되지만 쿼리 최적화 프로그램은 이를 인식하지 못해 홀수 결과를 초래할 수 있습니다.

다른 선택사항으로 추가할 거라고 생각했어요

다음을 수행할 수 있습니다.

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

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

그리고 그것은 이 링크에서 직접 가져온 것입니다. 저는 이 대답에 대해 어떻게 적절한 신용을 부여해야 할지 잘 모르겠습니다.

여기 단순하고 단일한 코드 줄이 있습니다.

이를 위해 SQL Inbuild RAND() 함수를 사용합니다.

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

여기서 a는 첫 번째 숫자(최소)이고 b는 범위의 두 번째 숫자(최대)입니다.

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

참고: CAST 또는 CONVERT 기능을 사용하여 INT 범위 번호를 얻을 수도 있습니다.

( 주형(RAND()*(25-10)+10 AS INT)

예:

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

다음은 두 숫자 사이의 난수를 생성하는 공식입니다(RETURN DECTION Range).

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

예:

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

자세한 내용은 다음을 참조하십시오. https://www.techonthenet.com/sql_server/functions/rand.php

단순:

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.

필요에 따라 이 코드를 변경하고 편집할 수 있습니다.

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-를 약간 변경했습니다.)

일반적으로:

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

질문에 대하여:

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

<=>

select rand()*3+3;
SELECT ROUND((6 - 3 * RAND()), 0)

함수로서 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
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;

따라서 사용자 정의 함수는 랜드()의 사용을 허용하지 않습니다.이에 대한 해결 방법(출처: 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

언급URL : https://stackoverflow.com/questions/7878287/generate-random-int-value-from-3-to-6

반응형