[JAVA] 랜덤값 생성

김규리·2026년 7월 29일

Math.random()

Math.random()은 0.0 이상 1.0 미만의 실수(double)를 반환한다.

double rand = Math.random();

반환 범위

0.0 <= Math.random() < 1.0

1~6까지의 랜덤 값 만들기

int dice = (int)(Math.random() * 6) + 1;

동작 과정

예를 들어 Math.random()이 0.73을 반환했다고 가정하면,

  1. 0.73 × 6 = 4.38
  2. (int)로 형변환하면 소수점이 버려져 4
  3. +1을 하면 5

즉, 결과는 1~6 사이의 정수가 된다.

범위 변화

계산식범위
Math.random()0.0 ~ 0.999...
Math.random() * 60.0 ~ 5.999...
(int)(...)0 ~ 5
+11 ~ 6

10~20까지의 랜덤 값 만들기

공식은 다음과 같다.

int num = (int)(Math.random() * (20 - 10 + 1)) + 10;

일반 공식

(int)(Math.random() * (최대값 - 최소값 + 1)) + 최소값

동작 과정

예를 들어 Math.random()이 0.81을 반환했다고 가정하면,

  1. 20 - 10 + 1 = 11
  2. 0.81 × 11 = 8.91
  3. (int) 형변환 → 8
  4. 8 + 10 = 18

따라서 10~20 사이의 정수가 반환된다.

범위 변화

계산식범위
Math.random()0.0 ~ 0.999...
Math.random() * 110.0 ~ 10.999...
(int)(...)0 ~ 10
+1010 ~ 20

랜덤 범위 공식

(int)(Math.random() * (최대값 - 최소값 + 1)) + 최소값

예시

// 1~100
int num = (int)(Math.random() * 100) + 1;

// 50~100
int num = (int)(Math.random() * (100 - 50 + 1)) + 50;

// 10~20
int num = (int)(Math.random() * (20 - 10 + 1)) + 10;

핵심 포인트

  • Math.random()은 0.0 이상 1.0 미만의 실수를 반환한다.
  • * (최대값 - 최소값 + 1)로 원하는 범위의 개수를 만든다.
  • (int)를 사용하면 소수점이 버려져 정수가 된다.
  • 마지막에 + 최소값을 해 원하는 시작 값으로 이동시킨다.

Random 클래스

Random 클래스는 java.util 패키지에 포함되어 있으며, 객체를 생성한 후 랜덤 값을 생성하는 방식이다.

Math.random()과 달리 형변환(casting)이 필요 없고, 원하는 자료형의 값을 바로 얻을 수 있다는 장점이 있다.

import java.util.Random;

Random random = new Random();

1~6까지의 랜덤 값 만들기

int dice = random.nextInt(6) + 1;

동작 과정

nextInt(6)은 0 이상 6 미만의 정수를 반환한다.

즉,

0, 1, 2, 3, 4, 5

여기에 +1을 하면

1, 2, 3, 4, 5, 6

즉, 1~6 사이의 정수가 생성된다.

범위 변화

계산식범위
random.nextInt(6)0 ~ 5
+11 ~ 6

10~20까지의 랜덤 값 만들기

int num = random.nextInt(11) + 10;

동작 과정

  1. 20 - 10 + 1 = 11
  2. nextInt(11) → 0 ~ 10
  3. +10 → 10 ~ 20

범위 변화

계산식범위
random.nextInt(11)0 ~ 10
+1010 ~ 20

일반 공식

random.nextInt(최대값 - 최소값 + 1) + 최소값

예시

// 1~100
int num = random.nextInt(100) + 1;

// 50~100
int num = random.nextInt(100 - 50 + 1) + 50;

// 10~20
int num = random.nextInt(20 - 10 + 1) + 10;

ThreadLocalRandom

ThreadLocalRandom은 java.util.concurrent 패키지에 포함된 클래스로, 멀티스레드 환경에서 성능이 좋은 랜덤 클래스이다.

객체를 직접 생성하지 않고 current() 메서드를 통해 사용할 수 있다.

import java.util.concurrent.ThreadLocalRandom;

1~6까지의 랜덤 값 만들기

int dice = ThreadLocalRandom.current().nextInt(1, 7);

nextInt(시작값, 끝값)에서 끝값은 포함되지 않는다.

따라서

nextInt(1, 7)

은 1 이상 7 미만, 즉 1~6의 정수를 반환한다.

범위

계산식범위
nextInt(1, 7)1 ~ 6

실수 랜덤 값 만들기

double randDouble = ThreadLocalRandom.current().nextDouble();

반환 범위

0.0 <= 값 < 1.0

즉, Math.random()과 동일하게 0.0 이상 1.0 미만의 실수를 반환한다.


원하는 범위의 정수 만들기

// 10~20
int num = ThreadLocalRandom.current().nextInt(10, 21);

nextInt(10, 21)은

  • 시작값(10)은 포함
  • 끝값(21)은 포함하지 않으므로

결과는 10~20이 된다.


정리

방식특징
Math.random()가장 간단하지만 double을 반환하므로 형변환이 필요하다.
Random객체를 생성해야 하지만 원하는 자료형을 바로 얻을 수 있다.
ThreadLocalRandom객체 생성이 필요 없고, 멀티스레드 환경에서 성능이 뛰어나며 범위를 지정하기 쉽다.

핵심 포인트

  • Random은 nextInt(범위) + 최소값 형태를 사용한다.
  • ThreadLocalRandom은 nextInt(최소값, 최대값 + 1) 형태를 사용한다.
  • ThreadLocalRandom의 끝값은 포함되지 않는다.

0개의 댓글