Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 난수 생성 완벽 가이드: 초보자를 위한 3가지 방법

Java 난수 생성 방법

사람에게 난수를 떠올리는 일은 아주 쉽습니다. 그저 "숫자 하나를 생각해 봐"라고 물으면 머릿속에 자연스럽게 숫자가 떠오르기 때문입니다.

프로그래밍에서도 이렇게 간단했다면 좋겠지만요. 다행히 Java에서는 핵심만 이해하면 난수를 손쉽게 생성할 수 있습니다.

이 가이드에서는 Java에서 난수를 생성하는 세 가지 방법을 살펴봅니다. 각 방법이 실제로 어떻게 동작하는지 숫자 맞추기 게임 예제를 통해 단계별로 확인해 보겠습니다.

난수 생성하기

누구나 한 번쯤은 숫자를 맞히는 게임을 해본 경험이 있을 겁니다. 정답을 맞히면 상품을 주는 게임도 있었죠. 이번 가이드에서는 Java로 직접 숫자 맞추기 게임을 만들어 보겠습니다.

첫 번째 단계는 당연히 난수를 생성하는 것입니다. 난수가 없다면 게임 자체가 성립하지 않습니다. 지금부터 활용할 수 있는 세 가지 방법을 하나씩 살펴보겠습니다.

1. Random 클래스 사용하기

Java에는 난수 생성에 활용할 수 있는 유용한 Random 클래스가 포함되어 있습니다. 숫자 맞추기 게임의 첫걸음으로, java.util.Random 클래스를 사용해 난수를 생성해 보겠습니다:

import java.util.Random;

class Main {
	public static void main(String args[]) {
		Random random_number_generator = new Random();
		int random_number = random_number_generator.nextInt(25);

		System.out.println(random_number);
	}
}

이 코드를 세 번 실행하면 다음과 같이 매번 다른 난수가 출력됩니다:

22
15
19

먼저 java.util.Random 클래스를 임포트한 뒤, 이 클래스의 인스턴스인 "random_number_generator" 객체를 생성했습니다. 이 인스턴스를 통해 난수를 만들어낼 수 있습니다.

nextInt() 메서드는 0부터 지정한 값까지의 범위에서 난수를 반환합니다. 위 코드에서는 25를 지정했으므로, 생성되는 모든 숫자는 0부터 25 사이에 속합니다.

2. Math.random() 메서드 사용하기

Math.random() 메서드는 약간의 추가 작업이 필요하지만, 여전히 난수를 생성하는 훌륭한 방법입니다. 이 메서드로 난수 생성기를 만들어 보겠습니다:

class Main {
	public static void main(String args[]) {
		int small = 0;
		int large = 25;

		int random_number = (int)(Math.random() * (large - small + 1) + small);
		System.out.println(random_number);
	}
}

Math.random()은 Java에 기본 내장되어 있기 때문에 별도의 임포트가 필요하지 않습니다.

먼저 두 개의 변수를 선언했습니다. "small"은 난수의 하한값, "large"는 상한값을 지정합니다.

그다음 공식을 적용해 난수를 계산했습니다. Math.random()은 그 자체로 정수를 반환하지 않고 0.0과 1.0 사이의 실수를 반환하기 때문입니다. 따라서 위 공식을 사용해 원하는 범위 내의 정수로 변환해야 합니다.

코드를 세 번 실행하면 다음과 같은 결과가 출력됩니다:

2
1
9

3. ThreadLocalRandom 클래스 사용하기

ThreadLocalRandom 역시 난수 생성에 사용할 수 있는 클래스입니다.

이 클래스는 여러 개의 난수를 병렬로 생성해야 하는 경우, 즉 주로 멀티스레딩 환경에서 특히 유용합니다.

이 방식으로 난수 생성기를 구현해 보겠습니다:

import java.util.concurrent.ThreadLocalRandom;

class Main {
	public static void main(String args[]) {
		int small = 0;
		int large = 25;

		ThreadLocalRandom random_number_generator = ThreadLocalRandom.current();
		int random_number = random_number_generator.nextInt(small, large);
		System.out.println(random_number);
	}
}

먼저 난수 생성에 사용할 ThreadLocalRandom 라이브러리를 임포트하고, 난수의 하한값과 상한값을 설정하는 두 개의 변수를 선언했습니다.

"random_number_generator" 변수가 ThreadLocalRandom 클래스를 참조하도록 초기화한 뒤, nextInt() 메서드에 "small"과 "large" 변수를 인수로 전달해 난수를 생성했습니다.

프로그램을 세 번 실행하면 다음과 같은 결과가 나옵니다:

4
23
15

이제 숫자 맞추기 게임의 나머지 부분을 완성할 준비가 되었습니다.

추측 로직 구현하기

난수 생성 방법을 익혔으니, 다음 단계는 사용자가 숫자를 입력해 정답을 맞힐 수 있는 로직을 구현하는 것입니다.

아래 코드는 앞서 소개한 세 가지 예제 어디에든 그대로 연결해서 사용할 수 있도록 변수명을 통일해 두었습니다.

먼저 Scanner 클래스를 사용해 사용자에게 숫자 추측 값을 입력받겠습니다:

import java.util.Scanner;

class Main {
	public static void main(String[] args) {
		// 추측 로직이 들어갈 부분
		Scanner guess = new Scanner(System.in);

		System.out.println("Guess a number between 1 and 25: ");
		int user_guess = guess.nextInt();
	}
}

이 코드는 사용자에게 "1부터 25 사이의 숫자를 맞혀보세요:"라는 안내 문구를 출력합니다. 사용자가 콘솔에 입력한 값은 "user_guess" 변수에 저장됩니다.

그다음 if 문을 작성해 사용자가 입력한 숫자가 프로그램이 생성한 난수와 일치하는지 확인합니다:

...
if (user_guess == random_number) {
	System.out.println("You have correctly guessed the number!");
} else {
	System.out.println("Your guess is incorrect!");
}

프로그램을 실행하고 1에서 25 사이의 숫자를 입력해 보겠습니다:

Guess a number between 1 and 25:
7
Your guess is incorrect!

반대로 정답을 맞히면 프로그램은 다음과 같이 출력합니다:

Guess a number between 1 and 25:
9
You have correctly guessed the number!

단 몇 줄의 코드만으로 숫자를 맞히는 게임을 성공적으로 완성했습니다.

마무리

난수는 프로그래밍 전반에서 폭넓게 활용됩니다. 이번 글에서는 숫자 맞추기 게임을 예제로 난수를 생성하고 활용하는 방법을 알아보았습니다.

Java에서 난수를 생성하는 대표적인 방법은 다음 세 가지입니다:

  • Random 클래스 사용
  • 기본 내장 메서드인 Math.random() 사용
  • ThreadLocalRandom 클래스 사용

조금 더 도전해 보고 싶으신가요? 이번에 만든 게임 코드를 수정해 사용자가 여러 번 추측을 시도할 수 있도록 바꿔 보세요.