본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

13. Java 자바 [API] - Math, Random 클래스

1. Math 클래스

 

java.lang.Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공한다.

해당 메소드들은 모두 정적(static) 이므로 Math 클래스로 바로 사용 가능하다.

 

메소드

설명

예제 코드

리턴값

int abs(int a)

double abs(double a)

절대값

int v1 = Math.abs(-5);

double v2 = Math.abs(-3.14);

v1 = 5

v2 = 3.14

double ceil(double a)

올림값

double v3 = Math.ceil(5.3);

double v4 = Math.ceil(-5.3);

v3 = 6.0

v4 = -5.0

double floor(double a)

버림값

double v5 = Math.floor(5.3);

double v6 = Math.floor(-5.3);

v5 = 5.0

v6 = -6.0

int max(int a, int b)

double max(double a, double b)

최대값

int v7 = Math.max(5, 9);

double v8 = Math.max(5.3, 2.5);

v7 = 9

v8 = 5.3

int min(int a, int b)

double min(double a, double b)

최소값

int v9 = Math.min(5, 9);

double v10 = Math.min(5.3, 2.5);

v9 = 5

v10 = 2.5

double random()

랜덤값

double v11 = Math.random();

0.0 <= v11 < 1.0

double rint(double a)

가까운 정수의 실수값

double v12 = Math.rint(5.3);

double v13 = Math.rint(5.7);

v12 = 5.0

v13 = 6.0

long round(double a)

반올림값

long v14 = Math.round(5.3);

long v15 = Math.round(5.7);

v14 = 5

v15 = 6

 

double value = 12.3456;

double temp1 = value * 100;

 

long temp2 = Math.round(temp1);            // 소수 셋째 자리수에서 반올림!

 

double v16 = temp2 / 100.0;

 

System.out.println(“v16 = ” + v16);

 

round() 메소드는 항상 소수 첫 번째 자리에서 반올림해서 정수값을 리턴한다.

원하는 자리에서 반올림 하려면 반올림할 자리를 맞추기 위해 10n 을 곱한다.

 

 

random() 메소드는 0.0 과 1.0 사이의 범위에 속하는 하나의 double 타입 값을 리턴한다.

 

0.0 <= Math.random() < 1.0

 

 

 

1 ~ 10 까지의 정수 난수를 얻으려면 아래와 같은 순서로 연산식을 만든다.

 

① 각 변에 10을 곱하면 0.0 <= ... < 10.0 사이 하나의 double 타입의 값을 얻을 수 있다.

 

0.0 * 10 <= Math.random() < 1.0 * 10

 

② 각 변을 int 타입으로 강제 타입 변환하면 0 <= ... < 10 사이의 범위에 속하는

     하나의 int 타입 값을 얻을 수 있다.

 

(int)(0.0 * 10) <= (int)(Math.random()*10) < (int)(1.0*10)

 

③ 각 변에 1을 더하면 1 <= ... < 11 사이의 범위가 된다.

 

(int)(0.0 * 10) + 1 <= (int)(Math.random()*10) < (int)(1.0*10) + 1

 

④ 따라서 start <= ... < start + n 범위에 속하는 하나의 정수를 얻기 위해서는 아래와 같은 연산식을 만들면 된다.

 

int num = (int) (Math.random() * n) + start;

 

예)

주사위 번호 뽑기 : int num = (int) (Math.random() * 6) + 1;

 

로또 번호 뽑기 : int num = (int) (Math.random() * 45) + 1;

 

 


2. Random 클래스

 

java.util.Random 클래스는 난수를 얻어내기 위한 다양한 메소드를 제공한다.

Math.random() 메소드는 0.0 ~ 1 사이의 double 난수를 얻는 데만 사용한다면,

 

Random 클래스는 boolean, int, long, float, double 난수를 얻을 수 있다.

 

Random 클래스는 종자값(seed)를 설정할 수 있다.

종자값은 난수를 만드는 알고리즘에 사용되는 값으로, 종자값이 같으면 같은 난수를 얻는다.

 

Random 클래스로 부터 Random 객체를 생성하는 생성자 2 가지

 

Random() : 호출 시마다 다른 종자값(현재 시간 이용) 이 자동 설정된다.

Random(long seed) : 매개값으로 주어진 종자값이 설정된다.

 

Random 클래스가 제공하는 메소드들

 

리턴값

메소드(매개 변수)

설명

boolean

nextBoolean()

boolean 타입의 난수를 리턴

double

nextDouble()

double 타입의 난수를 리턴 (0.0 <= ~ < 1.0)

int

nextInt()

int 타입의 난수를 리턴 (-231 <= ~ <= (231 - 1))

int

nextInt(int n)

int 타입의 난수를 리턴 (0 <= ~ < n)

 

예) RandomExample.java : 로또 번호 얻기

 

public class RandomExample {
    public static void main(String[] args) {
        //선택번호
        int[] selectNumber = new int[6];   // 선택 번호 6개가 저장될 배열 [자동]
        Random random = new Random(3);     // 선택 번호를 얻기 위한 Random 객체 생성
        System.out.print(“선택 번호 : ”);
        for(int i = 0; i < 6; i++) {
            selectNumber[i] = random.nextInt(45) + 1;  // 선택 번호를 얻어 배열에 저장
            System.out.print(selectNumber[i] + “ ” );
        }
        System.out.println();

        // 당첨번호
        int[] winningNumber = new int[6];   // 당첨 번호 6개가 저장될 배열
        random = new Random(5);              // 당첨 번호를 얻기 위한 Random 객체 생성
        System.out.print(“당첨 번호 : ”);
        for(int i = 0; i < 6; i++) {
            winningNumber[i] = random.nextInt(45) + 1;  // 당첨 번호를 얻어 배열에 저장
            System.out.println(winningNumber[i] + “ ” );
        }
        System.out.println();

        // 당첨 여부 확인하기
        Arrays.sort(selectNumber);    // 오름차순 정렬
        Arrays.sort(winningNumber);
        boolean result = Arrays.eqauls(selectNumber, winningNumber); // 배열 항목값 비교
        System.out.print(“당첨 여부 : ”);
        if(result) {
            System.out.println(“1등 당첨!!!”);
        } else {
            System.out.println(“꽝!”);
        }
    }
}