1. 목적
- 무작위 숫자를 만들어 그 갯수를 확인한다.
2. 문제 (점수 : 40점)
- 1부터 6사이의 임의의 정수 100개를 생성 각 숫자가 나타나는 확률을 계산하는 프로그램
- 정수를 출력할 필요는 없다.
- 중첩된 if-else 문 사용 / switch-case 문 사용 가능 (여기서는 switch-case 문으로 풀이)
- 실행 화면
2 가 나올 확률 : 0.190
3 이 나올 확률 : 0.150
4 가 나올 확률 : 0.210
5 가 나올 확률 : 0.200
6 이 나올 확률 : 0.100
Press any key to continue
3. 이해
- 원하는 범위의 난수를 잘 만들줄 아는가?
- if-else / switch-case 문을 잘 활용할 줄 아는가?
- 확률을 낼줄 아는가?
4. 코드
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int in = 0;
int i = 0;
int one = 0;
int two = 0;
int three = 0;
int four = 0;
int five = 0;
int six = 0;
srand((unsigned)time(NULL));
while(i<100)
{
in = (rand() % 6) + 1;
switch(in)
{
case 1:
one++;
break;
case 2:
two++;
break;
case 3:
three++;
break;
case 4:
four++;
break;
case 5:
five++;
break;
case 6:
six++;
break;
default:
rand();
break;
}
i++;
}
printf("1 이 나올 확률 : %0.3f\n", one == 0 ? 0 : (float)one/100 );
printf("2 가 나올 확률 : %0.3f\n", two == 0 ? 0 : (float)two/100 );
printf("3 이 나올 확률 : %0.3f\n", three == 0 ? 0 : (float)three/100 );
printf("4 가 나올 확률 : %0.3f\n", four == 0 ? 0 : (float)four/100 );
printf("5 가 나올 확률 : %0.3f\n", five == 0 ? 0 : (float)five/100 );
printf("6 이 나올 확률 : %0.3f\n", six == 0 ? 0 : (float)six/100 );
return 0;
}
5. 해설
- 확률이 드물게 0 이 된다면 100으로 나눌때 오류가 나는걸 방지 하기 위해 간단한 조건문을 작성
했습니다.
- 선언된 변수가 int 형이기 때문에 출력시 소숫점 출력을 위해 float 형으로 형변환(casting)을 했습
니다.
- 0 ~ 32797 을 6으로 나눈 나머지 0 ~ 5 까지의 숫자에서 1을 더해 1 ~ 6 까지의 나올수 있는 숫자
범위를 구했습니다.
- if-else 문은 switch-case 문보다 더 자세한 경우를 다룰수 있지만 이 경우 처럼 숫자가 제한적
인 경우 훨씬 세련된 코드로 보일수 있습니다.
- srand((unsigned)time(NULL)) 구문은 첫부분에서 선언한 이상 추가 선언시 난수 생성시 예상치
못한 경과가 생길수 있습니다.
6. 참고
- http://www.winapi.co.kr/clec/cpp1/8-2-1.htm : rand() : 내부 검색
- http://www.winapi.co.kr/clec/cpp1/9-3-4.htm : switch-case 구문