[TIL] Random, Math.random()
자바에서 난수를 생성하는 방법으로는 Random클래스를 이용한 방법과 random메서드를 이용한 방법 이렇게 두가지가 있다.
Random클래스
기본적으로 클래스인 만큼 java.util.Random의 임포트가 필요하다
스캐너를 이용하는것 처럼 Random random = new Random();을 이용하여 random객체를 생성해주면 이제 사용할 준비가 끝난것이다.
이 랜덤 클래스의 주요 메서드들로는 nextInt(), nextDouble(), nextBoolean(), nextLong() 등이 있는데 next뒤의 타입에 맞는 난수값을 생성하는 것이다.
이 랜덤 클래스의 특징 중 하나가 바로 시드를 사용할 수 있다는 것이다.
시드가 뭘까?
컴퓨터는 사실 난수를 만들어 낼 수 없다. 입력값에 따른 출력을 내어놓는것인데 그 입력값이 계속 바뀌다 보니 난수처럼 보이는 것이다. 이를 의사난수라고 한다.
이렇게 계속 바뀌는 입력값이 아닌 고정된 입력값을 준다면 계속해서 똑같은 값을 출력하게 될 것이다. 그것이 가능하게 하는게 바로 시드이다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Random rand = new Random();
rand.setSeed(11);
for(int i = 0; i < 5; i++){
System.out.println(rand.nextInt(20)+" ");
}
}
}
이런식으로 고정된 시드값을 주게 되면
계속해서 고정된 11, 15, 13의 값이 나오는걸 볼 수 있다.
그럼 계속 값이 바뀌게 생성하고 싶으면 어떻게 하면 될까?
바로 현재 시간을 이용하는 것이다.
rand.setSeed(System.currentTimeMillis());
시드에 특정 값을 지정하는것이 아닌 현재의 시간을 이용하게 되면 밀리초(1/1000) 단위로 현재 시간을 반환하기때문에 계속해서 바뀌는 것처럼 보이는 값을 생성할 수 있다.
그렇다면 Math.random()은 무엇일까?
Math.random()메서드는 java.lang.Math클래스의 정적메서드로 0.0에서 1.0사이의 난수값을 생성해내는데 타입은 double타입이다.
이 Math.random()은 내장 함수이기에 따로 import문을 필요로 하지 않는다.
for(int i = 0; i < 5; i++){
System.out.println(Math.random()+" ");
}
Main메서드 안에 이 코드를 넣어주면
이와 같은 0보다는 크고 1보다는 작은 값들이 생성되는 것을 확인할 수 있다.
그래서 만약 내가 원하는 범위의 난수를 생성하고싶으면 (int)(Math.random() * 10) + 1; 이런식으로 타입과 범위를 지정해주어야 한다. 이렇게 작성하게 되면 1부터 10까지의 난수중 하나를 만들어 낼 수 있는 것이다. for문 안에 이 코드를 적용시켜 작동하면
아까는 길게 나오던 소수점들이 사라지고 이렇게 1~10사이의 값으로 바뀐것을 확인할 수있다.
다만 Math.random()메서드는 기본적으로 현재시간을 기준으로 값을 생성하기에 Random클래스처럼 시드값을 설정할 수는 없다.
오늘은 간단하게 Random클래스와 Math.random() 메서드에 대하여 알아보았다.