Day 6. 난수를 활용한 실습

ho_c·2022년 2월 24일
0

국비교육

목록 보기
6/71
post-thumbnail
post-custom-banner

주말이 끝나 슬프지만 그래도 열심히 달려나가보자!

📝 목차

난수 (Random Number)


1. 난수 (Random Number)

프로그래밍을 하면 난수를 접목하게 될 일이 많은데, 주로 게임이나 시뮬레이팅에서 사용한다.
하지만 사람과 달리 컴퓨터는 능동적으로 불가능하기에 일종의 기법을 응용하여 구현한다.

public static void main(String[] args) {
	// 난수 (Random Number)
	int random;
	int i = 1;
		
	while (i<21){
		random = (int)(Math.random()*14+1);
		System.out.print(random + " ");
		if (i % 10 == 0) {
			System.out.println();
		}
		i++;
}

원리는 다음과 같다.

Math.random()0~1 사이의 double 타입의 난수를 반환한다.
수식으로 하면 0.0<= Math.random() <1.0 이다. 따라서 다음 공식을 응용하여 원하는 범위의 수를 구할 수 있다.

공식

난수 범위에서 내가 가지고 싶은 가장 작은 수를 X
난수 범위에서 내가 가지고 싶은 가장 큰 수를 Y

Math.random() * (Y-X+1) + X

여기서 (Y-X+1)는 내가 {원하는 수의 개수 + 1}이다.
그래서 0~9까지의 총 10개의 수를 뽑고 싶다면 Math.random()*10으로 인해 범위가 0<=Math.random()<10 으로 변환된다.

또 범위를 1~10으로 늘리고 싶다면 양쪽에 +1을 하여 범위를 1<=Math.random()<11 늘리면 된다.

정확한 공식은 Math.random()*(원하는 수의 개수) + (시작하는 수)이다.
문제는 Math.random()은 반환 타입이 double이라 소수점 아래까지 출력된다.
그러므로 casting을 이용하여 소수점 아래를 잘라버려 정수 값만 사용하면 된다.

실습

  1. 동전 앞/뒤 맞추기
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	int inputNumber;
	int random;
		
	while (true) {
		random = (int)(Math.random()*2+1);
		System.out.println("=== 동전 앞 뒤 맞추기 ===");
		System.out.print("숫자를 입력해주세요 (1. 앞면 / 2. 뒷면) : ");
		inputNumber = Integer.parseInt(scanner.nextLine());
			
		if (inputNumber == random) {
			System.out.println("맞췄습니다^^");
			System.out.println();
			System.out.println("--------------> restart");
			continue;
		} else {
			System.out.println("땡! 틀렸습니다.");
			break;
		}
	}
}
  1. 가위, 바위, 보

import java.util.Scanner;

public class Quiz_3_1 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int client;
		int computer;
		String clientPick;
		String computerPick;

		while (true) {
			computer = (int)(Math.random()*3+1);
			System.out.println("==== 가위 바위 보 게임 ====");
			System.out.print("숫자를 선택하세요 (1. 가위 / 2. 바위 / 3. 보) [ 종료 : 0 ] : ");
			client = Integer.parseInt(scanner.nextLine());

			// 사용자 입력
			if (client == 1) {
				clientPick = "가위";
			} else if  (client == 2) {
				clientPick = "바위";
			} else {
				clientPick = "보";
			}

			// 컴퓨터 입력
			if (computer == 1) {
				computerPick = "가위";
			} else if  (computer == 2) {
				computerPick = "바위";
			} else {
				computerPick = "보";
			}

			// 종료
			if (client == 0) {
				System.out.println("종료되었습니다.");
				System.exit(0);

			} else if (!(client == 1) && !(client == 2) && !(client == 3)) {
				// !((client == 1) || (client == 2) || (client == 3))
				System.out.println(!(client == 1) && !(client == 2) && !(client == 3));
				System.out.println("다시 입력하세요");
				continue;
			}

			// 게임 시작
			if ((client == 1 && computer == 3) || (client == 2 && computer == 1) || (client == 3 && computer == 2)) {
				System.out.println("당신은 " + clientPick + "를 냈습니다." );
				System.out.println("컴퓨터는 " + computerPick + "를 냈습니다." );
				System.out.println("======================");
				System.out.println("당신이 이겼습니다.");
				System.out.println();
				continue;
			} else if (client == computer) {
				System.out.println("비겼습니다.");
				System.out.println();
				continue;
			} else if ((client == 1 && computer == 2) || (client == 2 && computer == 3) || (client == 3 && computer == 1)) {
				System.out.println("당신은 " + clientPick + "를 냈습니다." );
				System.out.println("컴퓨터는 " + computerPick + "를 냈습니다." );
				System.out.println("======================");
				System.out.println("컴퓨터가 이겼습니다.");
				System.out.println();
				continue;
			}
		} 

	}	
}

나름 조건식 정도는 쉽게 이해한다고 생각했는데, 막상 여러 조건을 한번에 묶으려니 머리가 꼬여버렸다. 그리고 조건식 옆에 ;을 찍어논 걸 못 찾아서 30분을 혼자 헤맸더라...
무튼 나름대로 정리를 해놓자면 조건식이 true!을 통한 값의 반전을 인식해야 한다.

&& : !(client == 1) && !(client == 2) && !(client == 3) 
|| : !(( client == 1) || (client == 2) || (client == 3)) = 전체 !(false) = true
profile
기록을 쌓아갑니다.
post-custom-banner

0개의 댓글