JAVA

[JAVA]Random선언 시 Seed란 무엇을 의미하고, 왜 쓰는가?



JAVA에서 Random을 선언 할 때


1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
        Random rand = new Random(12);
        for(int i=1; i<=100; i++) {
            System.out.println(rand.nextInt(1000));
        }
        }
        
 
    }
 
 
 
cs

 

1
Random rand = new Random(seed);
cs

;

Seed값이 있는데,  이 Seed 즉 난수 값을 설정하는 이유는 컴퓨터는 원래 복잡한 연산을 수행하는 것보다 난수를 만드는 것을 더 어려워 한다고 합니다..!! 


 컴퓨터는 기본적으로 난수를 만들 수 없다.[1] 컴퓨터는 기본적으로 정해진 입력에 따라 정해진 값을 낼 뿐이다. 전문용어로는 결정적 유한 오토마타(DFA) 기계라고 한다. 따라서 이를 해결하기 위해 컴퓨터는 아래 나오는 난수 생성 알고리즘을 사용해 난수를 생성한다.


https://namu.wiki/w/%EB%82%9C%EC%88%98%EC%83%9D%EC%84%B1


컴퓨터는 난수를 그냥 생성하는 것이 아닌 난수 생성 알고리즘을 사용해 난수를 생성한다고 합니다!!!(그래서 어려운가 봅니다)

이때 이 난수 알고리즘 실행하기 위해 쓰는 수를 Seed(씨앗)이라 부릅니다.


따라서 만약 계속 같은 seed(씨앗)을 사용한다면 컴퓨터는 계속 같은 패턴의 난수를 생성하게 됩니다.


예를들어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

public static void main(String[] args) {
        Random rand = new Random();
        rand.setSeed(11);
 
        for (int i = 1; i <= 5; i++) {
            System.out.print(rand.nextInt(20+ " ");
 
        }
 
    }
 
}
 
 
cs



Seed를 11로 지정을 했을 때 값은  

계속 계속!!!!!!!

1
18 11 15 13 
cs

1
18 11 15 13 
cs

위의 값만 나옵니다!!!


따라서 난수 생성의 목적은 계속 다른 값이 나오는 것인데, 씨앗이 같다면 같은 값만 나오면 의미가 없어진다.

또한 다른 사람이 씨앗 값을 알게 된다면 더 이상 Random의 효력은 없어진다.


따라서 보통 씨앗 값을 대표적으로 지속적으로 바뀌는 "현재 시간"을 사용해 난수가 계속 바뀌도록 작성 할 수 있습니다.

그러므로 씨앗 값을  현재 시간 값이 나오게 해주는


System.currentTimeMillis() 으로 설정을 하면, 11로 설정한 것과는 다르게 계속 다른 값이 나오게 할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
        // TODO Auto-generated method stub
        Random rand = new Random();
        rand.setSeed(System.currentTimeMillis());
 
        for (int i = 1; i <= 5; i++) {
            System.out.print(rand.nextInt(20+ " ");
 
        }
 
    }
 
}
 
cs



1
17 11 13 
cs

1
13 
cs

이제 Seed(씨앗)이 무엇인지 이해 할 수 있겠죠!? 이상 마치겠습니다~~~~~.



많은 피드백 부탁드리겠습니다!!

반응형

'JAVA' 카테고리의 다른 글

[JAVA] 예외처리 방법  (0) 2020.08.21
[JAVA] 오브젝트의 동일성과 동등성  (0) 2020.07.31