1-10 범위의 난수 생성


95

이 질문 에서 작업 한 테스트 쿼리에 대한 접근 방식 효과 가 없었기 때문에 지금은 다른 것을 시도하고 있습니다. pg의 random()함수에 1과 10 사이의 숫자 만 가져 오도록 지시하는 방법이 있습니까?

답변:


152

1에서 10 사이의 숫자로> = 1 및 <10 인 부동 소수점을 의미하면 쉽습니다.

select random() * 9 + 1

다음을 사용하여 쉽게 테스트 할 수 있습니다.

# select min(i), max(i) from (
    select random() * 9 + 1 as i from generate_series(1,1000000)
) q;
       min       |       max
-----------------+------------------
 1.0000083274208 | 9.99999571684748
(1 row)

정수를 원하면> = 1 및 <10이면 간단합니다.

select trunc(random() * 9 + 1)

그리고 다시 간단한 테스트 :

# select min(i), max(i) from (
    select trunc(random() * 9 + 1) as i from generate_series(1,1000000)
) q;
 min | max
-----+-----
   1 |   9
(1 row)

이벤트에서 date (e.created_at) + (trunc (random () * 20)) 선택 e; 결과 : 오류 : 연산자가 존재하지 않습니다 : 날짜 + 배정 밀도 trunc가 실제로 정수를 반환합니까?
Bogdan Gusiev

3
trunc()입력과 동일한 데이터 유형을 반환합니다 (매뉴얼에 명시된대로). 결과를 정수로 캐스트해야합니다.trunc(random() * 20)::int
a_horse_with_no_name

적어도 이론적 으로는 배정 밀도 유형random()부정확 한 특성 으로 인해 9를 곱하면> = 9가되는 값 <1을 반환 할 수 있는지 궁금합니다 . 실제로 가능하더라도 15 자리 정도의 정밀도로 인해 당연히 사라질 가능성은 거의 없습니다.

1
나는 놀겠다는 거있어 width_bucket(random(), 0, 1, 10)대안으로

것 같습니다 내 두려움은 근거가 있었다 나는 모든 :-)에서 수학을 이해하지 고백하지만

17

요약하고 약간 단순화하려면 다음을 사용할 수 있습니다.

-- 0 - 9
select floor(random() * 10);
-- 0 - 10
SELECT floor(random() * (10 + 1));
-- 1 - 10
SELECT ceil(random() * 10);

그리고 @ user80168이 언급 한 것처럼 이것을 테스트 할 수 있습니다.

-- 0 - 9
SELECT min(i), max(i) FROM (SELECT floor(random() * 10) AS i FROM generate_series(0, 100000)) q;
-- 0 - 10
SELECT min(i), max(i) FROM (SELECT floor(random() * (10 + 1)) AS i FROM generate_series(0, 100000)) q;
-- 1 - 10
SELECT min(i), max(i) FROM (SELECT ceil(random() * 10) AS i FROM generate_series(0, 100000)) q;

2
문서 말하는 "범위 0.0 <= X <1.0의 무작위 값이"너무 적어도 이론적 기회가 ceil(random() * 10)0의 결과 - I가 고집 것이다 floor.

1
나는 @JackDouglas와 동의합니다. 그래서 범위 1-10의 경우SELECT floor(random() * 10 + 1);
SergiyKolesnikov

9

SQL Server를 사용하는 경우 정수를 얻는 올바른 방법은

SELECT Cast(RAND()*(b-a)+a as int);

어디

  • 'b'는 상한입니다.
  • 'a'는 하한입니다.

여기서주의하십시오. 하한을 1로, 상한을 10으로 설정하면 1-> 9의 숫자 만 표시됩니다. 다른 답변은 Between 1과 10이 1-> 9를 의미한다고 가정하는 것 같습니다. 'between'이 상한을 제외하면 하한도 제외해야한다고 제안합니다 (예 : 2-> 9). SELECT Cast (RAND () * ((b + 1) -a) + a as int);
Morvael

이 질문은 PostgreSQL 질문으로 명확하게 태그가 지정되어 있습니다.
Sebastian Palma

4

(trunc (random () * 10) % 10) + 1


오류 : 연산자가 없습니다 : 배정 밀도 정수 %

1
어쨌든 왜 계수를 사용합니까? 이 논리는 말이되지 않습니다. "포장"을 받으면 균등 분배를받을 수 없으며,받지 못하면 필요하지 않습니다.
ErikE

1

hythlodayr의 대답의 올바른 버전.

-- ERROR:  operator does not exist: double precision % integer
-- LINE 1: select (trunc(random() * 10) % 10) + 1

의 출력 trunc으로 변환되어야한다 INTEGER. 그러나 trunc. 그래서 그것은 간단합니다.

select (random() * 9)::INTEGER + 1

범위 [1, 10], 즉 1과 10을 모두 포함하는 INTEGER 출력을 생성합니다.

임의의 숫자 (부동 수)에 대해서는 user80168의 답변을 참조하십시오. 즉, INTEGER.


0

사실 나는 당신이 이것을 원하는지 모르겠습니다.

이 시도

INSERT INTO my_table (my_column)
SELECT
    (random() * 10) + 1
;

0

이 저장 프로시 저는 테이블에 랜드 번호를 삽입합니다. 조심하세요, 그것은 끝없는 숫자를 삽입합니다. 충분한 숫자를 얻으면 실행을 중지하십시오.

커서에 대한 테이블을 만듭니다.

CREATE TABLE [dbo].[SearchIndex](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Cursor] [nvarchar](255) NULL) 

가다

숫자를 포함 할 표를 만듭니다.

CREATE TABLE [dbo].[ID](
[IDN] [int] IDENTITY(1,1) NOT NULL,
[ID] [int] NULL)

스크립트 삽입 :

INSERT INTO [SearchIndex]([Cursor])  SELECT N'INSERT INTO ID  SELECT   FLOOR(rand() * 9 + 1)  SELECT COUNT (ID) FROM ID

절차 생성 및 실행 :

CREATE PROCEDURE [dbo].[RandNumbers] AS
BEGIN
Declare  CURSE  CURSOR  FOR (SELECT  [Cursor] FROM [dbo].[SearchIndex]  WHERE [Cursor] IS NOT NULL)
DECLARE @RandNoSscript NVARCHAR (250)
OPEN CURSE
FETCH NEXT FROM CURSE
INTO @RandNoSscript 
WHILE @@FETCH_STATUS IS NOT NULL 
BEGIN
Print @RandNoSscript
EXEC SP_EXECUTESQL @RandNoSscript;  
 END
 END
GO

테이블 채우기 :

EXEC RandNumbers

3
문제는 포스트 그레스하지 SQL 서버에 관한 것입니다
a_horse_with_no_name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.