카테고리 없음

[TIL] Random, Math.random()

Twisted 2024. 10. 22. 21:41

자바에서 난수를 생성하는 방법으로는 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() 메서드에 대하여 알아보았다.