본문 바로가기
Dev Note/JAVA

[JAVA] 난수생성 Math.random() vs Random

by iyos 2020. 10. 22.

 

이전에 난수에 대한 개념과 Seed에 대한 내용을 알아보았다. 이번에는 실제로 JAVA에서 사용되는 대표적인 난수 생성 방법인 Random클래스와 Math 클래스의 random()메소드에 대해 알아보자. 두 가지의 차이중 종자값의 개념이 포함되므로 seed 종자값에 개념은 설명은 미리 이해하는 것이 좋다. 

 

2020/10/22 - [🕵🏻‍♀️개발지식/이론] - 컴퓨터에서 생성하는 난수는 진짜 난수가 아니다?

 

컴퓨터에서 생성하는 난수는 진짜 난수가 아니다?

코드를 짜다보면 '난수'를 사용해야하는 경우가 많다. 습관적으로 Random클래스나 Math클래스의 random() 매소드를 쓰곤 했는데 정확한 차이를 모르고 썼는데, 알고리즘 공부를 하던 중 난수가 진짜

todayscoding.tistory.com

 

 

 


 

자바에서 난수를 얻어내는 방법은 Random클래스를 활용하는 방법과 Math클래스를 활용하는 방법 2가지가 있다.

Math.random() Random
0.0에서 1사이의 double 난수를 얻을 수 있음 boolean, int, long, float, double 난수를 얻을 수 있음
종자값(seed)이 현재시간으로 고정 종자값(seed)을 설정 할 수 있음

 

큰 차이는 위와 같고 두 가지의 방법에 대해 자세히 알아보자.

 

 

1. Math.random()

Math 클래스는 최상위 클래스인 Object 클래스 안에 있으므로 따로 Import를 시켜주지 않아도 사용이 가능하다. 또한 Math.random()메소드도 static메소드로 이루어져있기에 바로 호출할 수 있다. Math.random()의 메소드는 시드값으로 현재시간을 사용하므로 매번 실행시킬때마다 다른 숫자가 출력다. 또한 Math.random() 메서드를 실행하면 실수형의 0.0 ~ 1.0사이의 무작위 실수값이 하나 리턴된다. 소수점 자리수가 무한한 무한소수의 형태로 출력되므로 무한에 가까운 경우의 수가 나타난다. 이 실수값을 정수형으로 가공을 하고 싶다면 값에 정수값을 곱하거나 나눈 다음 형변환하여 사용한다.

 

 

 

2. Random

Random 클래스는 java.util 패키지안에 있어 사용시 import가 필요하고 할당연산자 new를 통해 객체를 생성해주어야 한다. 기본 생성자를 통해 Random객체를 생성하면 현재시간을 종자값으로 사용하고 setSeed메서드를 통해 시드값을 따로 설정해줄수도 있다. 

ran.setSeed(10);

()안에 seed값을 넣어주면 실행할 때마다 같은 패턴으로 랜덤값이 나오는 것을 알 수 있다. 이렇게 정해진 랜덤패턴을 사용하기 위해서는 Random클래스를 사용하면 된다. 하지만 사용자에게 예측 불가능한 랜덤값을 나타내고 싶을때는 seed값을 지정하는 것은 안전하지 않은 선택이다.

 

 

 

반응형