RANDOM

RANDOM

RANDOM 함수는 호출할 때마다 의사 난수(pseudo-random) 64비트 정수를 반환해요.

팁: 특정 범위 안의 무작위 정수를 생성하려면 RANDOM 함수를 UNIFORM 함수와 함께 사용하세요.

출처: 문서

본문

문법 (Syntax)

RANDOM([seed])

인자 (Arguments)

선택 (Optional):

  • seed — 시드는 정수예요. 서로 다른 시드는 RANDOM이 서로 다른 출력 값을 생성하게 해요. 시드를 제공하지 않으면 플랫폼별 방식으로 무작위 시드가 선택돼요.

사용 메모 (Usage notes)

  • SQL 문이 각 행에 대해 동일한 시드로 RANDOM을 호출하면, 시드가 같더라도 RANDOM은 각 행에 대해 서로 다른 값을 반환해요.
  • SQL 문이 같은 행에 대해 동일한 시드로 RANDOM을 두 번 이상 호출하면, RANDOM은 해당 행에 대해 각 호출마다 동일한 값을 반환해요. 예를 들어 다음은 각 행에 대해 동일한 값을 두 번 반환해요: SELECT RANDOM(42), RANDOM(42) FROM table1. 아래 예제를 참조하세요.
  • RANDOM을 호출하는 문을 두 번 이상 실행해도 RANDOM이 매번 동일한 값 집합을 생성한다는 보장은 없어요. 시드를 지정했는지 여부와 관계없이 마찬가지예요. 동일한 데이터로 동일한 문을 호출해도 RANDOM은 다른 값을 생성할 수 있어요. 예를 들어 이런 경우에 발생할 수 있어요: 워커 스레드 수가 다르거나, 행이 다른 순서로 처리될 때.
  • 무작위 값이 반드시 고유한 값은 아니에요. 호출 수가 적으면 중복은 드물지만, 호출 수가 늘어날수록 중복 확률도 올라가요. 고유한 값이 필요하면 RANDOM 호출 대신 시퀀스(SEQ1 / SEQ2 / SEQ4 / SEQ8) 사용을 고려하세요. 순환이 발생하지 않을 만큼 충분한 비트 수를 가진 시퀀스를 선택하세요.
  • 출력이 유한한 정수이고 알고리즘에 의해 진짜 난수처럼 생성되는 것이 아니기 때문에, 함수는 결국 “순환(wrap around)”해서 값 시퀀스를 반복하기 시작해요. 하지만 순환 전 호출 수인 “주기(period)”는 극도로 큽니다: 2^19937 - 1.
  • 출력은 의사 난수일 뿐이에요. 충분한 정보(알고리즘과 시드 포함)가 주어지면 출력을 예측할 수 있어요.
  • RANDOM은 MT19937-64로 알려진 64비트 메르센 트위스터(Mersenne twister) 알고리즘을 구현해요.
  • 의사 난수를 생성하는 것은 계산상 다소 비용이 커요. 이 함수를 많이 호출하면 상당한 리소스를 소비할 수 있어요.

예제 (Examples)

다음 예제들은 RANDOM 함수를 사용하는 방법을 보여줘요. 아래 출력에 표시된 값은 직접 예제를 실행했을 때 반환되는 값과 다를 수 있어요.

다음 예제는 시드 없이 RANDOM을 호출해요. 각 행의 출력은 서로 달라요.

SELECT RANDOM() FROM TABLE(GENERATOR(ROWCOUNT => 3));
+----------------------+
|             RANDOM() |
|----------------------|
|  -962378740685764490 |
|  2115408279841266588 |
| -3473099493125344079 |
+----------------------+

다음 예제는 각 행에 대해 동일한 시드로 RANDOM을 호출해요. 시드가 상수이지만 각 행의 출력은 여전히 서로 달라요.

SELECT RANDOM(4711) FROM TABLE(GENERATOR(ROWCOUNT => 3));
+----------------------+
|         RANDOM(4711) |
|----------------------|
| -3581185414942383166 |
|  1570543588041465562 |
| -6684111782596764647 |
+----------------------+

다음 예제는 단일 문 안에서 시드를 사용하지 않고 RANDOM을 여러 번 호출해요. RANDOM은 각 행 내에서도, 서로 다른 행 사이에서도 서로 다른 값을 반환해요:

SELECT RANDOM(), RANDOM() FROM TABLE(GENERATOR(ROWCOUNT => 3));
+----------------------+----------------------+
|             RANDOM() |             RANDOM() |
|----------------------+----------------------|
|  3150854865719208303 | -5331309978450480587 |
| -8117961043441270292 |   738998101727879972 |
|  6683692108700370630 |  7526520486590420231 |
+----------------------+----------------------+

다음 예제는 단일 문 안에서 RANDOM을 여러 번 호출하고 각 호출에 동일한 시드를 사용해요. RANDOM은 각 행 내에서는 동일한 값을, 서로 다른 행에서는 다른 값을 반환해요:

SELECT RANDOM(4711), RANDOM(4711) FROM TABLE(GENERATOR(ROWCOUNT => 3));
+----------------------+----------------------+
|         RANDOM(4711) |         RANDOM(4711) |
|----------------------+----------------------|
| -3581185414942383166 | -3581185414942383166 |
|  1570543588041465562 |  1570543588041465562 |
| -6684111782596764647 | -6684111782596764647 |
+----------------------+----------------------+

더 알아보기 (Learn more)