JAVA

JAVA API 를 이용한 주사위 통계

🤖 Play with Android 🤖 2021. 8. 26. 14:16
728x90


출처 - 클라우드 스터딩

 

 

 


우선 랜덤으로 주사위의 숫자를 만들어주는 클래스를 만들어보자

우리는 주사위 A와 B의 숫자를 다른 2가지 방법으로 뽑아낼 것이다.

 

 

 

우선 이를 위해 자바 API를 사용해야 하는데 자바 API란 무엇일까?

자바 API란, 프로그램을 만들기 위한 도구이다. 이를 사용하면 더 편리한 프로그래밍이 가능하다. 자바 API는 패키지로 제공된다. 

 

 


 

 

첫 번째 방법은

 

📌  java.lang.Math를 이용한 방법

Math클래스의 random() 메소드는 0.0 이상 1.0 미만의 범위에서 임의의 double형 값을 하나 생성하여 반환한다.

이 메소드는 내부적으로 java.util 패키지의 Random 클래스를 사용한 의사 난수 발생기(pseudorandom-number generator)를 사용하여 임의의 수를 생성하게 된다.

 

 

Math클래스에 관한 자세한 내용은 다음의 링크를 참고하면 된다.

http://tcpschool.com/java/java_api_math

 

 

 

그렇다면 주사위의 숫자를 뽑아내는 첫 번째 클래스를 만들어보자

class DieA {
    // 1 부터 6사이 정수를 반환
    public static int roll() {
        double r = Math.random() * 6; // 0.0 <= r < 6.0
        int randInt = (int) r;        // 0, 1, 2, ..., 5
        return randInt + 1;           // 1, 2, 3, ..., 6
    }
}

 

 

우선 Math.random( )을 통해서 0.0 ~ 1.0 사이의 난수를 뽑아낸 뒤 6을 곱해준다 (주사위는 숫자가 6까지 있으므로)

그리고 소수점을 없애주기 위하여 형 변환을 통해 int형으로 변경시켜준다. 여기까지 하면 int형 변수 randInt에 0~5까지 숫자 중 하나가

랜덤하게 들어가게 된다.

여기서 주사위는 1~6까지의 숫자를 가지고 있으므로 +1을 더해줘 return 하면 주사위의 숫자를 랜덤하게 뽑아주는 첫 번째 클래스 완성이다.

 

 

 

 

 

 

주사위의 숫자를 뽑아내는 두 번째 클래스를 만들어보자

📌  java.util 패키지에 포함된 Random 클래스의 nextInt() 메소드를 사용

class DieB {
    public static int roll() {
        /* Random 클래스를 활용하여 주사위의 눈값(1 ~ 6)을 반환하시오.*/
        Random rand = new Random();
        int ni = rand.nextInt(6); // 0 ~ 5 중 하나 반환
        return ni + 1;

    }
}

 

 

이번엔 java.util 패키지에 포함된 Random 클래스의 nextInt() 메소드를 사용해도 난수를 생성해 보았다. nextInt의 장점이라면 

처음부터 매개변수를 통해 숫자의 범위를 지정해줄 수 있다.

하지만 Random 클래스에 선언된 nextInt 메서드의 경우 static 이 붙지 않았기 때문에 즉 클래스 메서드가 아니기 때문에 Random 객체를 생성하여 메서드를 호출해줘야 한다.

그 외의 방법은 동일하다.

 

 

 

그렇다면 이제 배열을 만들어 각각의 자리에 2~12가 어느 빈도로 들어갔는지 저장해 준 뒤 그 빈도만큼 '#'을 출력해 주면 된다.

출력과 관련된 코드는 다음과 같다.

public class RandomRest2 {
    public static void main(String[] args) {
        int[] array = new int[13]; //index 0 ~ 13

        for(int i = 0; i < 100; i++){
            int a = DieA.roll();
            int b = DieB.roll();
            array[a + b]++; //배열에 빈도수를 저장한다.
        }

        for(int i = 2; i < array.length; i++){
            System.out.printf("%d => ", i);
            for(int j = 0; j < array[i]; j++){
                System.out.printf("%c", '#');
            }
            System.out.println();
        }
    }
}

 

array 배열에서 index가 0과 1인 칸은 사용되지 않는다. (두 개의 주사위의 합이 0과 1이 될 수는 없기 때문에)

 

 

 

다음과 같이 원하는 결과가 출력됨을 확인할 수 있다.