본문 바로가기

공부/C언어

(C 예제) 로또 번호 출력하기/가위바위보 및 응용

// 로또 복권 출력하기
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main(void)
{
	int num1, num2, num3, num4, num5, num6;

	srand((int)time(NULL));

	num1 = rand() % 45 + 1;

	do
	{
		num2 = rand() % 45 + 1;
	} while (num2 == num1);

	do
	{
		num3 = rand() % 45 + 1;
	} while (num3 == num1 || num3 == num2);

	do
	{
		num4 = rand() % 45 + 1;
	} while (num4 == num1 || num4 == num2 || num4 == num3);

	do
	{
		num5 = rand() % 45 + 1;
	} while (num5 == num1 || num5 == num2 || num5 == num3 || num5 == num4);

	do
	{
		num6 = rand() % 45 + 1;
	} while (num6 == num1 || num6 == num2 || num6 == num3 || num6 == num4 || num6 == num5);

	printf("로또 숫자는 %d %d %d %d %d %d 입니다\n", num1, num2, num3, num4, num5, num6);
}

srand((int)time(NULL));를 알아보자.

 

rand() 함수는 0부터 32767 사이의 값을 랜덤하게 반환해준다.

하지만 프로그램 생성 때부터 값이 정해지기에 반복 실행 시 같은 값만 나온다.

rand() 함수의 초기화는 srand의 매개변수로 들어오는 seed값을 이용한다.

따라서 seed값에 따라 rand() 함수의 결과가 달라질 수 있다.

 

항상 변하는 seed값을 만들기 위해서는 아래와 같은 원리를 사용한다.

time()함수는 현재시간과 1900년 1월 1일 0시 0분 0초를 기준으로 몇 초가 흘렀는지

계산해서 알려준다. 그러므로, 실행할때마다 내 시간이 달라지고, 값도 달라진다.

 

int는 time()으로부터 받은 값이 엄청 커서 int범위를 넘어설 경우를 대비해 int형으로
강제 변환 시키는 것이다.

 

정해진 범위에서 랜덤한 값을 만들고 싶으면 아래와 같이 하면된다.

rand() % 45 + 1은 1부터 45까지의 난수를 생성한다.

 

도움이 된 블로그

https://blockdmask.tistory.com/308

 

[C언어/C++] rand, srand, time 랜덤함수에 대해서 (난수생성)

안녕하세요. BlockDMask 입니다. 오늘은 C/C++로 개발할때 가끔 사용하는 랜덤한 수(난수)를 생성하는 함수에 대해서 알아보겠습니다. 랜덤한 값을 가지고올때 필요한데요. 그럼 시작해보겠습니다. 1

blockdmask.tistory.com


다음은 do ~ while관련이다.

 

일단 예를 들어보자.

 

num1에 1부터 45까지의 숫자가 랜덤하게 들어가고, 들어간 숫자가 30이었다고 생각하자.

 

그 다음에, num2에 1부터 45까지의 숫자중에서 10이 들어갔다고 생각하자.

 

while에서 num2와 num1이 같은지 확인해본다.

만약에 같다면 참이 되어 다시 do로 올라가고, 만약에 다르다면 거짓이 되어 반복이

종료되어 다음 줄로 넘어간다.

 

넘어간 다음줄에서 num3가 랜덤하게 생성된다. 만약에 생성된 num3의 값이

num1과 num2 둘 중 하나라도 같으면 즉, 하나라도 참이면 || 연산자로 인해 결과가 참이되고,

다시 바로 위의 do로 올라가서 num3를 랜덤한 수로 다시 생성한다.

 

위의 과정을 num6까지 거치면 num1부터 num6까지 모두 다르게 생성될 수 있다.


가위바위보 프로그램

// 가위바위보
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main(void)
{
	int UserNum;
	int ComNum;

	srand((int)time(NULL));

	ComNum = rand() % 3; // 0:가위 1:바위, 2:보

	printf("컴퓨터는 준비가 되었습니다.\n");
	printf("당신은 0. 가위, 1. 바위, 2. 보 중에서 무엇을 내실건가요? 숫자로 적어주세요. ");
	scanf("%d", &UserNum);

	if (ComNum == 0)
	{
		if (UserNum == 0)
			printf("컴퓨터 %d 사용자 %d로 비겼습니다.\n", ComNum, UserNum);
		else if (UserNum == 1)
			printf("컴퓨터 %d 사용자 %d로 사용자가 이겼습니다.\n", ComNum, UserNum);
		else if (UserNum == 2)
			printf("컴퓨터 %d 사용자 %d로 사용자가 졌습니다.\n", ComNum, UserNum);
	}
	else if (ComNum == 1)
	{
		if (UserNum == 0)
			printf("컴퓨터 %d 사용자 %d로 사용자가 졌습니다.\n", ComNum, UserNum);
		else if (UserNum == 1)
			printf("컴퓨터 %d 사용자 %d로 비겼습니다.\n", ComNum, UserNum);
		else if (UserNum == 2)
			printf("컴퓨터 %d 사용자 %d로 사용자가 이겼습니다.\n", ComNum, UserNum);
	}
	else if (ComNum == 2)
	{
		if (UserNum == 0)
			printf("컴퓨터 %d 사용자 %d로 사용자가 이겼습니다.\n", ComNum, UserNum);
		else if (UserNum == 1)
			printf("컴퓨터 %d 사용자 %d로 사용자가 졌습니다.\n", ComNum, UserNum);
		else if (UserNum == 2)
			printf("컴퓨터 %d 사용자 %d로 비겼습니다.\n", ComNum, UserNum);
	}
}

설명할 필요도 없이 간단하다.


쫌 더 간단하게 하면 아래와 같다.

// 쫌 더 간단하게
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main(void)
{
	int ComNum;
	int UserNum;

	srand((int)time(NULL));
	ComNum = rand() % 3;

	printf("컴퓨터는 준비가 되었습니다.\n");
	printf("당신은 0. 가위, 1. 바위, 2. 보 중에서 무엇을 내실건가요? 숫자로 적어주세요. ");
	scanf("%d", &UserNum);

	if	(UserNum == (ComNum + 1) % 3)
	{
		printf("컴퓨터 %d 사용자 %d로 사용자가 이겼습니다.\n", ComNum, UserNum);
	}
	else if (UserNum == (ComNum + 2) % 3)
	{
		printf("컴퓨터 %d 사용자 %d로 사용자가 졌습니다.\n", ComNum, UserNum);
	}
	else if (UserNum == ComNum)
	{
		printf("컴퓨터 %d 사용자 %d로 비겼습니다.\n", ComNum, UserNum);
	}
	else
	{
		printf("올바른 값을 넣어주세요.\n");
	}

	printf("게임을 종료합니다.");
}

 

가위, 바위, 보는 각각 0, 1, 2이다.

이를 이기는 바위, 보, 가위는 각각 1, 2, 0이다.

이 사이에는 공식이 있다.

 

0(가위), 1(바위), 2(보)를 UserNum이라고 하고,

2(보), 0(가위), 1(바위)를 ComNum이라고 하자.

ComNum에 1을 더하고 3을 나눈 나머지는 UserNum과 같다.

이는 사용자가 이겼을 경우의 공식이다.

 

다음은, 컴퓨터가 이겼을 경우를 보자.

0(가위), 1(바위), 2(보)를 UserNum이라고 하고,

1(바위), 2(보), 0(가위)를 ComNum이라고 하자.

ComNum에 2를 더하고 3을 나눈 나머지는 UserNum과 같다.

 

복잡한 계산으로 검증해볼 필요는 없다.

간단하게 확인해보자.