본문 바로가기
Web

[Java] Random 함수의 작동원리

by DuncanKim 2022. 7. 15.
728x90

[Java] Random 함수의 작동원리

 

갑자기 그런 생각이 들었다. Random은 정말 랜덤하게 난수를 생성할까?

Java에서 랜덤을 활용하는 방법은 대표적으로 두 가지가 있다. Math 클래스의 random() 메소드를 활용하는 것과 Random 클래스의 next 메소드 시리즈를 사용하는 것.

 

숫자 놀이가 재미있어서 여기까지 오게 되었다... 이전에 만들어본 자바 로또 번호 추출기를 이용해서 Random 클래스의 작동원리에 대해서 알아보겠다.

 

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

public class Lotto {
    public static void main(String[] args) {
        System.out.println("==금주의 행운의 번호==");
        for (int i = 0; i < 5; i++) {
            int[] randomArray = new int[45];
            int loop = 2100000000;
            int j = 0;
            Random rm = new Random();
            while (j < loop) {

                int a = rm.nextInt(45);
                randomArray[a] += 1;
                j++;
            }

            // Collection.max()를 쓰기 위해서 배열(randomArray)을 ArrayList(randomList)로 변환.
            ArrayList<Integer> randomList = new ArrayList<>();
            for (Integer temp : randomArray) {
                randomList.add(temp);
            }

            // 추천번호 6개 뽑기 : randomList에서 가장 큰 값을 가지고 있는 인덱스를 찾고
            // 그 인덱스를 recommendArray에 원소로 집어넣고 기존의 randomList에 있는 값은 0으로 바꿈
            // (그 다음 큰 값을 가지고 있는 인덱스를 찾는데 방해가 되지 않게 하기 위해서)
            int[] recommendArray = new int[6];
            for (int k = 0; k < 6; k++) {
                int b = Collections.max(randomList);
                recommendArray[k] = randomList.indexOf(b) + 1;
                randomList.set(randomList.indexOf(b), 0);
            }

            // 번호 오름차순 정렬 후 출력
            Arrays.sort(recommendArray);
            for (int l = 0; l < 6; l++) {
                if (l == 0) {
                    System.out.printf("[%d, ", recommendArray[l]);
                    continue;
                }else if (l == 5) {
                    System.out.printf("%d]\n", recommendArray[l]);
                    continue;
                }
                System.out.printf("%d, ", recommendArray[l]);
            }
        }
    }
}

일단, Random 클래스의 작동방식을 알아보자.

Random 클래스의 생성자의 경우, 종자값을 매개변수로 받는다.

매개변수를 쓰지 않으면, 호출 시마다 다른 종자값(현재시간 이용)이 자동 설정된다. 

매개변수를 쓰면 그 값을 종자값으로 하여 난수를 생성한다.

 

종자값이 무엇인가?

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

 

자 여기에서 난수를 만드는 알고리즘이라고 했는데, 종자값이 같으면 난수도 같다고 하였다. 그렇다면, 이 Random 클래스는 어떤 만들어진 값을 가지고 개발자에게 무작위의 수를 주는 것 밖에 되지 않는다.

 

실제로 종자값이 같은 경우(매개변수를 준 경우), 똑같은 값이 나온다.

 

하지만 설정하지 않으면, 다음과 같은 값이 나온다.

 

결론적으로 Random 클래스든, Math 클래스든, 난수 생성의 알고리즘을 가지고 만들어놓은 수를 하나씩 일정하게 뱉어내는 것에 불과하다는 것을 알 수 있다. 

 

이제 로또는 그만 알아보자...

728x90

댓글