Math.random()Math.random()은 0.0 이상 1.0 미만의 실수(double)를 반환한다.
double rand = Math.random();
반환 범위
0.0 <= Math.random() < 1.0
int dice = (int)(Math.random() * 6) + 1;
예를 들어 Math.random()이 0.73을 반환했다고 가정하면,
0.73 × 6 = 4.38(int)로 형변환하면 소수점이 버려져 4+1을 하면 5즉, 결과는 1~6 사이의 정수가 된다.
| 계산식 | 범위 |
|---|---|
Math.random() | 0.0 ~ 0.999... |
Math.random() * 6 | 0.0 ~ 5.999... |
(int)(...) | 0 ~ 5 |
+1 | 1 ~ 6 |
공식은 다음과 같다.
int num = (int)(Math.random() * (20 - 10 + 1)) + 10;
일반 공식
(int)(Math.random() * (최대값 - 최소값 + 1)) + 최소값
예를 들어 Math.random()이 0.81을 반환했다고 가정하면,
20 - 10 + 1 = 110.81 × 11 = 8.91(int) 형변환 → 88 + 10 = 18따라서 10~20 사이의 정수가 반환된다.
| 계산식 | 범위 |
|---|---|
Math.random() | 0.0 ~ 0.999... |
Math.random() * 11 | 0.0 ~ 10.999... |
(int)(...) | 0 ~ 10 |
+10 | 10 ~ 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();
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 |
+1 | 1 ~ 6 |
int num = random.nextInt(11) + 10;
20 - 10 + 1 = 11nextInt(11) → 0 ~ 10+10 → 10 ~ 20| 계산식 | 범위 |
|---|---|
random.nextInt(11) | 0 ~ 10 |
+10 | 10 ~ 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;
ThreadLocalRandomThreadLocalRandom은 java.util.concurrent 패키지에 포함된 클래스로, 멀티스레드 환경에서 성능이 좋은 랜덤 클래스이다.
객체를 직접 생성하지 않고 current() 메서드를 통해 사용할 수 있다.
import java.util.concurrent.ThreadLocalRandom;
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~20이 된다.
| 방식 | 특징 |
|---|---|
Math.random() | 가장 간단하지만 double을 반환하므로 형변환이 필요하다. |
Random | 객체를 생성해야 하지만 원하는 자료형을 바로 얻을 수 있다. |
ThreadLocalRandom | 객체 생성이 필요 없고, 멀티스레드 환경에서 성능이 뛰어나며 범위를 지정하기 쉽다. |
핵심 포인트
Random은nextInt(범위) + 최소값형태를 사용한다.ThreadLocalRandom은nextInt(최소값, 최대값 + 1)형태를 사용한다.ThreadLocalRandom의 끝값은 포함되지 않는다.