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로 지정을 했을 때 값은
계속 계속!!!!!!!
위의 값만 나옵니다!!!
따라서 난수 생성의 목적은 계속 다른 값이 나오는 것인데, 씨앗이 같다면 같은 값만 나오면 의미가 없어진다.
또한 다른 사람이 씨앗 값을 알게 된다면 더 이상 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 3 7 11 13 | cs |
1 | 13 1 5 2 4 | cs |
이제 Seed(씨앗)이 무엇인지 이해 할 수 있겠죠!? 이상 마치겠습니다~~~~~.
많은 피드백 부탁드리겠습니다!!
'JAVA' 카테고리의 다른 글
[JAVA] 예외처리 방법 (0) | 2020.08.21 |
---|---|
[JAVA] 오브젝트의 동일성과 동등성 (0) | 2020.07.31 |