Java엔 random값을 뽑을 때 Random클래스에 있는 메서드들과 Math클래스에 있는 random메서드를 이용하는 두 가지 방법을 이용할 수 있다.
여기선 Math.random()만 이용할 것이다.
사용 방법 설명하기 전에 두 방법의 차이점에 대해 얘기하자면 다음과 같다.
- Math.random()
이 메서드가 처음 호출되면 Random클래스를 생성하며 이후의 random메서드 호출 시 이전에 생성한 Random클래스를 재사용한다. (document)
0.0 이상 1.0 미만의 무작위 double값을 반환한다.
이건 확실하지 않은 개인적인 생각인데 Random클래스의 nextDouble메서드를 이용하는 것 같다. - Random클래스
double값 말고도 특정 타입의 무작위 값을 반환해주는 메서드들이 있다. (document)
사용 방법
- 0부터 시작하는 범위의 수 뽑기
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
int randomVal = (int)(Math.random() * 10); // 0 ~ 9 의 무작위 수
System.out.println(randomVal);
}
}
}
0 ~ 9 범위의 무작위 수가 나오는 이유부터 설명하겠다.
Math.random에 반환값은 double인 실수 값으로 0.0 이상 1.0 미만의 수가 반환된다.
만약 0.329573296... 값이 반환되면 해당 수에 10을 곱하면 3.29573296...이 된다.
그렇다면 여기서 int형으로 강제로 형변환을 하게 되면 소수점의 수들이 모두 잘려 3이 나오게 된다.
만약 0.0137498... 값이 반환됐을 때 10을 곱하면 0.137498...이라 int형으로 형변환되면 0이 된다.
만약 0.9324569... 값이 반환됐을 때 10을 곱하면 9.324569...이라 int형으로 형변환되면 9가 된다.
1.0이상은 나올 수 없으므로 10은 나올 수 없다.
따라서 (int)(Math.random() * 10); 이 문장은 0 ~ 9 범위의 랜덤 값을 뽑는다.
위의 설명을 통해 범위는 0 ~ (곱하는 수 - 1)로 된다는 것을 알 수 있다.
그런데 최솟값을 바꾸고 싶은 사람도 분명 있을 것이고 최솟값과 최댓값 모두 바꿔 특정 범위의 무작위 수만 뽑고 싶은 사람도 있을 것이다.
그런 사람들을 위한 코드는 아래에 있다.
- 특정 범위의 수 뽑기
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
int randomVal = (int)(Math.random() * 7 + 1 - 5) + 5; // 5 ~ 7 의 무작위 수
System.out.println(randomVal);
}
}
}
랜덤 수 뽑아내는 쪽을 보면 (int)(Math.random() * 7 + 1 - 5) + 5 로 되어있는데 이것을 쉽게 나타내면
(int)(Math.random() * (최댓값 + 1) - 최솟값) + 최솟값 이다.
먼저 랜덤 범위를 지정하는 것은 int로 바꾼 (Math.random() * (최댓값 - 1) - 최솟값)이 부분이다.
위 코드의 식을 계산해보면 알겠지만 (int)(Math.random() * 7 + 1 - 5)로 나올 수 있는 정수의 최댓값은 2이다. 그렇다면 범위는 0 ~ 2가 된다.
(int)(Math.random() * (최댓값 + 1) - 최솟값) + 최솟값이
(0 ~ 2) + 최솟값이 된것이다.
0 ~ 2범위에 최솟값 5를 더하면 최종적으로 5 ~ 7이란 범위가 나오게 된다.
여러가지 시도해보며 써보면 금방 이해간다.
참고
'개발 > Java' 카테고리의 다른 글
중복되지 않는 난수 생성 (0) | 2021.09.02 |
---|