본문 바로가기
비전공자코딩교실/JAVA

[비전공자코딩교실] 숫자야구 게임을 위한 중복되지 않는 난수 생성하기

by 세 미 콜 론 2021. 6. 4.
728x90
반응형

지난시간에 정한 프로세스를 우선 주석으로 적어두도록 합니다.

미리 이렇게 주석으로 적어두면 따로 문제를 보면서 개발하지 않아도 되어 편리하답니다. 다만 프로세스와 메소드 리스트를 꼼꼼히 적지 않으면 개발 사항에 누락이 생기게 되기 때문에 빠진 기능이 없이 적어주도록 합니다. 자, 그럼 우선 makeNumber()를 만들어볼까요?

makeNumber()의 기본형은 이렇게 만들어줍니다. 주요한 부분만 설명해보자면.. 첫줄에 있는 int[]는 지난 시간에 설명했듯 리턴 타입입니다. 즉, 해당 메소드를 실행하고 난 결과로 무엇을 줄것인지 지정하는 것인데요. int[]는 int 배열을 얘기합니다. 우리는 중학교 수학 과정에서 { 1, 2, 3 } 형태로 집합이라는 것을 배웠는데요. 그것과 마찬가지로 int[]는 int를 여러개 가지고 있는 변수를 의미합니다. 우리는 중복되지 않는 숫자를 3개 만들어서 int배열에 넣어서 return할 예정이기 때문에 위와 같은 기본형을 가지게 됩니다. int배열인 randomNumber 변수는 선언을 할 때 new int[3] 이라고 선언해주었는데요. 이 것은 어떤 int형이 들어갈지 모르지만 size가 3이라는 뜻입니다. 즉, 3개의 숫자가 들어있는 배열이라고 이해하면 될 것 같습니다. 그럼 이제 안에 랜덤한 숫자를 만드는 기능을 넣어보도록 하겠습니다.

랜덤 숫자를 만드는 것은 java에서 제공하고 있습니다. 따라서 우리는 앞서 배운 for문을 활용하여 3개의 랜덤 숫자를 만들어서 int[]인 randomNumber 변수에 넣어주도록 하겠습니다. for문은 0부터 randomNumber.length만큼 돌게 되는데요. length는 길이라는 뜻입니다. 우리는 해당 변수의 길이를 3으로 생성했기 때문에 3이나 마찬가지입니다.
for문 안에 있는 코드를 확인해보겠습니다. 우선 randomNumber[i]는 randomNumber의 i번째 자리를 의미합니다. i는 0부터 시작하는데 컴퓨터에서 말하는 순서, 즉 index는 0부터 시작합니다. 1부터 시작하는 순서와는 다릅니다. 따라서 randomNumber 변수 안에 있는 각 자리는 각각 0, 1, 2라는 자리 번호(index)를 가지고 있습니다. 그렇다면 i번째 자리에 넣는 것은 무엇일까요? 바로 (int)(Math.random() * 10) 입니다. 우선 Math.random()에 대해 알아보겠습니다.
해당 메소드는 java.util에서 제공하고 있는데요. javadoc 문서를 확인해보겠습니다.

double java.lang.Math.random()

  • random
    public static double random()
    Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.
    When this method is first called, it creates a single new pseudorandom-number generator, exactly as if by the expression
    This new pseudorandom-number generator is used thereafter for all calls to this method and is used nowhere else.
    This method is properly synchronized to allow correct use by more than one thread. However, if many threads need to generate pseudorandom numbers at a great rate, it may reduce contention for each thread to have its own pseudorandom-number generator.
    Returns:
    a pseudorandom double greater than or equal to 0.0 and less than 1.0.
    See Also:
    Random.nextDouble()
  • new java.util.Random()

javadoc은 해당 함수에 대한 정보를 가지고 있습니다. 중요한 부분은 Returns: 부분입니다. random()함수의 경우 double 타입으로 0.0부터 1.0보다 작은 숫자를 반환한다고 되어 있습니다. 우리는 0부터 9까지의 숫자 중 하나를 사용할 예정이기 때문에 해당 부분에 * 10을 추가한 것입니다. 그렇게 하면 0.0 * 10부터 1.0*10보다작은 숫자를 반환하게 됩니다. 그런데 앞에 (int)가 있는 이유는 우리가 정수를 반환할 예정이기 때문입니다. double 타입은 소수점이 있는 숫자를 말합니다. 그렇기 때문에 우리는 (int)를 붙여서 소수점이 있는 숫자를 소수점이 없는 숫자로 반환하게 됩니다.

이렇게 한 뒤 main 메소드에 makeNumber()를 실행하면서 출력까지 하는 소스를 적어보겠습니다.

아까 적은 주석 아래에 소스를 추가했습니다. System.out.println(a[i])를 for문 안에 넣은 이유는 배열에서 하나씩 꺼내서 출력해주기 위함입니다. 자, 이제 위 소스의 실행 결과를 확인하겠습니다.

실행 결과 4, 9 ,4 라는 숫자가 만들어졌습니다. 실행할때마다 다른 숫자가 들어있게 됩니다. 자, 그러면 우리는 초반에 설정했던 조건을 떠올립니다. 숫자 야구 게임은 중복되지 않은 숫자를 가지고 게임을 하게 됩니다. 따라서 중복일 경우 제거를 하고 다시 난수를 생성해야 합니다.

중복 숫자 제거는 생각보다 간단합니다. 바로 새로운 숫자를 넣을 때마다 for문 안에서 for문을 돌려서 현재 배열에 들어있는 모든 숫자 중 새로운 숫자와 겹치는 것이 있다면 i를 더해준 것을 다시 --로 감소시켜주는 것입니다. 이렇게 하면 절대로 중복되지 않는 난수를 세 개 만들 수 있습니다. 더 명확한 확인을 위해 각 부분에 출력부를 추가해보겠습니다.

중복으로 7이라는 숫자를 뽑았더니 i를 감소시켜서 다시 첫번째 for문을 돌게 하였습니다. 다음 시간에는 프로세스 중 2번 사용자에게 숫자를 입력받는 방법과 3번 입력받은 숫자의 심판 결과를 확인하는 소스를 만들어보겠습니다. 

728x90
반응형

댓글