자바에서 난수를 얻어내는 방법은 Random클래스를 활용하는 방법과 Math클래스를 활용하는 방법 2가지가 있습니다. 두 방법의 차이점은 Math.random() 메소드는 0.0에서 1사이의 double 난수를 얻는데만 사용한다면, Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있습니다. 또 Math.random()은 종자값(seed)가 현재시간으로 고정인 반면 Random클래스는 종자값(seed)을 설정 할 수 있습니다. 종자값은 난수를 만드는 알고리즘에 사용되는 값으로 종자값이 같으면 같은 난수를 얻습니다.
Math.random()
public class RandomExample {
public static void main(String[] args) {
System.out.println("0.0 ~ 1.0 사이의 난수 1개 발생 : " + Math.random());
System.out.println("0 ~ 10 사이의 난수 1개 발생 : " + (int)((Math.random()*10000)%10));
System.out.println("0 ~ 100 사이의 난수 1개 발생 : " + (int)(Math.random()*100));
}
}

Math 클래스는 최상위 클래스인 Object 클래스 안에 있으므로 따로 Import를 시켜주지 않아도 사용이 가능하며 Math.random()메소드도 static메소드로 이루어져있기에 바로 호출할 수 있습니다. Math.random()의 메소드는 시드값으로 현재시간을 사용하므로 매번 실행시킬때마다 다른 숫자가 출력됩니다. Math.random() 메서드를 실행하면 실수형의 0.0 ~ 1.0 미만 사이의 무작위 실수값이 하나 리턴됩니다. 소수점 자리수가 무한한 무한소수의 형태로 출력되므로 무한에 가까운 경우의 수가 나타납니다. 정수형으로 가공을 하고 싶다면 나머지를 활용하는 방법 곱셈을 활용하는 방법 두가지 방법을 활용할 수 있습니다.
Math.random( )을 정수로 사용하기
1. random의 값을 충분히 높여준 뒤 나머지 연산을 합니다. 나머지 연산 값보다 무조건 작은값이 나옵니다.
2. random의 값을 원하는 자리수만큼 곱한 뒤 int형으로 변환하면 소수점 단위는 자동 절삭되어 정수형으로 표현이 가능합니다.
Random 클래스 활용
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random(); //랜덤 객체 생성(디폴트 시드값 : 현재시간)
random.setSeed(System.currentTimeMillis()); //시드값 설정을 따로 할수도 있음
System.out.println("n 미만의 랜덤 정수 리턴 : " + random.nextInt(10));
System.out.println("무작위 boolean 값 : " + random.nextBoolean());
System.out.println("무작위 long 값 : " + random.nextLong());
System.out.println("무작위 float 값 : " + random.nextFloat());
System.out.println("무작위 double 값 : " + random.nextDouble());
System.out.println("무작위 정규 분포의 난수 값 :" + random.nextGaussian());
}
}
Random 클래스는 java.util 패키지안에 있어 사용시 import가 필요하고 new를 통해 객체를 생성해주어야 합니다. 기본 생성자를 통해 Random객체를 생성하면 현재시간을 종자값으로 사용하고 setSeed메서드를 통해 시드값을 따로 설정해줄수도 있습니다.
Random클래스 주요 메서드
| 메서드 | 설명 |
| setSeed(long n) | 매개값으로 주어진 종자값이 설정됩니다. |
| boolean nextBoolean() | boolean타입의 난수를 리턴합니다. |
| double nextDouble() | doouble 타입의 난수를 리턴합니다. |
| int nextInt() | int 타입의 난수를 리턴합니다. |
| int nextInt(int n) | int 타입의 0 ~ 매개값까지의 난수를 리턴합니다. |
| double nextGaussian() | 평균이 0.0이고 표준편차가 1.0인 정규분포 난수를 리턴합니다. |
로또 번호 생성
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random rd = new Random();//랜덤 객체 생성
for(int i=0;i<6;i++) {
System.out.print("["+(rd.nextInt(45)+1)+"]"); //로또번호 출력
}
}
}

'Languague > Java' 카테고리의 다른 글
| [Java] 자바 제곱근(루트) 구하기 Math.sqrt() (2) | 2020.04.30 |
|---|---|
| [Java] 자바 거듭 제곱 구하기 Math.pow() (2) | 2020.04.29 |
| [Java] 자바 정규 표현식 (Pattern, Matcher) 사용법 & 예제 (4) | 2020.04.27 |
| [Java] 자바 OS 환경변수 값 불러오기 System.getenv() 사용법 (4) | 2020.04.26 |