본문 바로가기

Java & Kotlin

[Java] Java의 난수 생성법 2가지

난수 생성법 2가지

Math.random() 이용

아래와 같이 Math.random은 0~1.0 사이의 double을 반환하기 때문에 (int)를 취하고 있다.

(int)를 하게 되면 소수점 이하 숫자들은 버림으로 처리된다.

따라서 형 변환 이전에 곱셈을 해줘야 한다.

int attackValue = (int) (1 + Math.random() * 5); // 1~5 사이 정수 반환
int healValue = (int) (1 + Math.random() * 3); // 1~3 사이 정수 반환

아래와 같이 확률을 구현할 수도 있다. 3:7의 비율로 조건을 처리해 준 모습이다.

int attackValue = (int) (Math.random() * 10);
if (attackValue >= 7) {
    return 'h';
} else {
    return 'a';
}

Random Class 이용

Random 클래스는 java.util 패키지에 포함되기 때문에 import를 해줘야 한다.

Random 객체를 생성한 다음, 원하는 메서드를 사용하여 난수를 생성할 수 있다.

주요 메서드들은 주로 next+자료형 의 형태로, 인수를 넣어주지 않으면 각 자료형의 min~max 사이의 난수를 생성한다.

import java.util.Random;

public class MyRandom {
   public static void main(String[] args) {

   Random rd = new Random();

   System.out.print(rd.nextBoolean()); // 랜덤한 boolean 출력
   System.out.print(rd.nextInt(5)+1); // 1-6까지의 랜덤한 int 출력
   System.out.print(rd.nextInt()); // 랜덤한 int 출력
   System.out.print(rd.nextLong()); // 랜덤한 long 출력
   System.out.print(rd.nextFloat()); // 랜덤한 float 출력
   System.out.print(rd.nextDouble()); // 랜덤한 double 출력

   }
}

Random 클래스에서는 Seed를 따로 받아서 Seed에 대응되는 난수를 생성할 수 있다. Random함수의 인자로 Seed 값을 넣어주거나, setSeed를 통해 Seed를 설정해 줄 수 있다.

 

Seed를 설정하지 않았을 때 매번 다른 값이 나오는 이유는 기본값으로 현재 시간 이 설정되어 있기 때문이다. 시스템 시간은 항상 변하기 때문에 매번 다른 값이 나오는 것이다.

import java.util.Random; 

public class main { 
  public static void main(String[] args) { 
    Random rnd = new Random(5); // 시드값에 5를 고정 
    for(int i = 0; i < 5; i++) { 
		    System.out.println(rnd.nextInt(10)+1); 
    } 
  } 
}

/* 출력
8
3
5
5
7
*/

위와 같이 Random 객체의 seed값을 5로 고정하면, 몇 번을 실행해도 8,3,5,5,7의 값이 생성되는 것을 확인할 수 있다. 따라서 Random Class의 난수 생성 방식은 이미 Seed값에 따라 고정되어 있는 값을 불러온다는 사실을 유추할 수 있다.

 

[Java] 자바 난수(랜덤 숫자) 생성하기 (Math, Random)