주말이 끝나 슬프지만 그래도 열심히 달려나가보자!
난수 (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
을 이용하여 소수점 아래를 잘라버려 정수 값만 사용하면 된다.
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;
}
}
}
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