자바에서 난수를 생성하는 방법은 Math 클래스를 활용하는 방법과 Random 클래스를 활용하는 방법 두 가지가 있다.
두 방법의 차이점은 Math.random() 메소드는 0.0에서 1.0 사이의 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()을 정수로 사용하기
- random의 값을 충분히 높여준 뒤 나머지 연산을 한다.
- 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.tuil 패키지 안에 있어 사용 시 Import가 필요하고 new를 통해 객체를 생성해주어야 한다.
기본 생성자를 통해 Random 객체를 생성하면 현재시간을 종자값으로 사용하고 setSeed 메서드를 통해 시드값을 따로 설정해줄 수도 있다.
메소드 | 설명 |
setSeed(long n) | 매개값으로 주어진 종자값이 설정된다. |
nextBoolean() | boolean 타입의 난수를 리턴한다. |
nextDouble() | double 타입의 난수를 리턴한다. |
nextInt() | int 타입의 난수를 리턴한다. |
nextInt(int n) | int 타입의 0 ~ 매개값 미만까지의 난수를 리턴한다. |
nextGaussian() | 평균이 0.0이고 표준편차가 1.0인 정규분포 난수를 리턴한다. |
'JAVA > Java Study' 카테고리의 다른 글
[Java] 정수 제곱근 판별 (0) | 2024.01.28 |
---|---|
[Java] HashMap (0) | 2024.01.15 |
[Java] 아스키 코드 (0) | 2024.01.11 |
[Java] StringBuffer 개념과 사용법 (0) | 2024.01.11 |
[Java] throw와 throws는 언제 사용하는 것일까? (1) | 2024.01.09 |