[C] 3-2. random (난수)

Kim Dongil·2022년 10월 5일
0

C

목록 보기
5/28

난수 (무작위로 숫자 생성)

#include<stdlib.h> //rand(), srand()
#include<time.h> //time()

srand(time(NULL)); // 난수 초기화
int num = rand() % 3; // 0 ~ 2

시드(seed) : 컴퓨터 프로그램에서 발생하는 무작위 수는 사실 엄격한 의미의 무작위 수가 아니다. 어떤 특정한 시작 숫자를 정해 주면 컴퓨터가 정해진 알고리즘에 의해 마치 난수처럼 보이는 수열을 생성한다.

// 매번 같은 숫자가 나옴
printf("난수 초기화 이전...\n"); 
for (int i = 0; i < 10; i++)
printf("%d ", rand() % 10);

몇 번을 재 실행해도 같은 결과값이 나오는 이유 : 컴퓨터에서 난수를 생성하는 방법 때문
컴퓨터에서는 난수를 생성하는 방법을 seed값을 두고 그 seed값을 특정 공식으로 구해서 계속해서 난수를 생성
특정 값을 같은 공식으로 계산하면 몇 번을 실행해도 같은 값이 됨

// 매번 다른 숫자가 나오게 됨
srand(time(NULL)); //seed값으로 현재시간 부여 
printf("\n\n난수 초기화 이후..\n");  
for (int i = 0; i < 10; i++)
printf("%d ", rand() % 10);

계속해서 난수의 값을 바꾸고 싶다면 rand함수의 seed값을 바꿔줘야 한다.
srand(seed) 함수에서 seed값을 설정할 수 있다.
참고로 srand함수를 사용하지 않는다면 자동으로 seed값은 1이 된다.
자동으로 seed값이 바뀌게 하는 방법은 현재시간을 seed값으로 넣으면 된다
위와 같이 seed값으로 현재 시간을 넣으면 초당 seed값이 계속해서 변화하기 때문에 실행할 때마다 랜덤한 난수의 값들을 얻음

switch case

if문과 비슷한 역할을 하는 switch문(switch case문)

switch문은 경우에 따라 if문보다 더 적합한 때가 있다.
바로 몇 가지 선택지가 주어지고, 그에 대한 선택을 할 때
("1. 프로그램 실행, 2. 대기, 3. 종료"처럼 선택지가 몇 가지 있을 때)

ex) 게임
시뮬레이션 게임에서 대화에 따라 몇 가지 대답을 선택해야 할 때
이렇게 여러가지의 선택지가 정해져 있고, 그 제한된 범위 내에서만 선택된다면,
switch case문에 적합 (if문보다 확실히 묶여있게 소스도 보기 좋다)

// 가위 0 바위 1 보 2

srand(time(NULL));
int i = rand() % 3;  // 0 ~ 2 반환
if (i == 0)
{
	printf("가위\n");
}
else if (i == 1)
{
	printf("바위\n");
}
else if (i == 2)
{
	printf("보\n");
}
else
{
	printf("몰라요\n");
}

아래와 같이 만들 수도 있음

srand(time(NULL));
int i = rand() % 3;  // 0 ~ 2 반환
int i = 0;
switch (i)
{
case 0:printf("가위\n"); break; // break문을 안넣으면 다음 구문도 전부 실행된다
case 1:printf("바위\n"); break;
case 2:printf("보\n"); break;
default:printf("몰라요\n"); break;
}

case 에 없다면 default 부분을 실행시킴 (if/else문에서는 else역할)
아래와 같이 만들 수도 있음

int age = 8;
switch (age)
{
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:printf("초등학생입니다\n"); break;
case 14:
case 15:
case 16:printf("중학생입니다\n"); break;
case 17:
case 18:
case 19:printf("고등학생입니다\n"); break;
default : printf("학생이 아닌가봐요\n"); break;
}

break문을 안넣으면 다음 구문도 실행되기 때문에 case 8~12를 실행하고 또 다음 구문인 case 13이 실행되는 것이다.

Project (Up and Down)

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main_random(void)
{
	srand(time(NULL));
	int num = rand() % 100 + 1; // 1 ~ 100 사이의 숫자 
	printf("숫자 : %d\n", num);
	int answer = 0; // 정답
	int chance = 5; // 기회
	while (1) // 1 : 참, 0 : 거짓
	{
		printf("남은 기회 %d 번\n", chance--);
		printf("숫자를 맞춰보세요 (1~100) : ");
		scanf_s("%d", &answer);

		if (answer > num)
		{
			printf("DOWN \n\n");
		}
		else if (answer < num)
		{
			printf(" UP \n\n");
		}
		else if (answer == num)
		{
			printf("정답입니다! \n\n");
			break;
		}
		else
		{
			printf("알 수 없는 오류가 발생했어요 \n\n");
		}

		if (chance == 0)
		{
			printf("모든 기회를 다 사용하셨네요. 아쉽게 실패했습니다\n");
			break;
		}
	}
 	return 0;
 }

C 언어 무료 강의 (입문부터 게임 개발까지)
랜덤함수(rand, srand, time) 사용법 & 예제 (난수 생성)
Random선언 시 Seed란 무엇을 의미하고, 왜 쓰는가?
switch case문(조건문2) 이해, 예제 -C언어
출처: https://prosto.tistory.com/119 [Prosto:티스토리]

0개의 댓글