C 12Day (20160122)
by jennysgap난수(Random Number)
- 정의 : 임의의 값 또는 무작위로 만들어지는 알 수 없는 값
- 난수 생성의 활용 : 주사위 게임(모두의 마블), 가위바위보, 포커게임 및 슈팅게임 등
- 난수 생성 함수 : stdlib.h 헤더파일에 정의
rand( )
srand( )
rand 함수
- 0~32767의 범위 중 무작위 수를 생성
- seed 값에 따라 발생하는 난수의 값이 결정되는데 기본으로 seed값은 1이다.
rand함수 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> #include <stdlib.h> int main(void) { int num, i; //난수가 정수형태이기 때문에 int를 씀 for(i=0; i<5; i++) { num=rand(); printf("%d\n", num); } } | cs |
무작위 수를 생성한다고 하지만 첫번째는 무조건 41이 나옴
이것은 시드값이 다 똑같기 때문임 (seed 값은 1)
그렇기 때문에 시드값을 바꿔야 하는데 지정해주는 함수가 srand
srand 함수
- 난수에 발생되는 seed 값을 지정
- rand함수가 실행되고 난 뒤 seed 값은 변경된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdlib.h> int main(void) { int num, i; srand(23); for(i=0; i<5; i++) { num=rand(); printf("%d\n", num); } } | cs |
seed 값을 바꿨지만, 여기서도 문제점이 발생!
프로그램을 끄고 다시 시작하면 같은 난수가 나온다. (난수의 값 패턴이 같다는 뜻)
그렇기 때문에 seed값을 계속 바꿔줘야 하는데, 지금도 시간이 계속 바뀌는게 뭘까? 시간!
시간값을 seed로 주면 난수 값은 계속 변화게 됨!
시간(time) 함수
- 시간마다 입력 값이 바뀌므로 난수 함수를 매번 다르게 생성할 수 있음
- 시간 함수를 이용하기 위해서는 time.h를 선언해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num, i; srand((unsigned)time(NULL)); //NULL현재시간 - 년월일시분초 / unsigned(부호없는) : 음수를 사용하지 않겠다. for(i=0; i<5; i++) { num=rand(); printf("%d\n", num); } } | cs |
이때, 하나 드는 생각!
혹시나 누군가 같은시간 때 동시에 누른다면 값이 같아지지 않을까? 그럴 땐 rand함수를 여러번 입력해서 더 꼬아준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int num, i; srand((unsigned)time(NULL)); //NULL현재시간 - 년월일시분초 / unsigned(부호없는) : 음수를 사용하지 않겠다. rand(); //내가 프로그램을 짰는데 혹시나 다른 프로그램이랑 겹칠수도 있으니 랜드함수를 더 써서 rand(); //더 꼬아준다. rand(); for(i=0; i<5; i++) { num=rand(); printf("%d\n", num); } } | cs |
문제!
- rnad 함수를 이용하여 0~32767의 범위 중 무작위 수를 생성하는데, 원하는 수 만큼 임의로 출력하고 싶다면 어떻게 해야하는지 찾아보세요
http://colorscripter.com/s/O60LOsr - 임의의 수를 0~9의 범위 내에서 무작위로 수를 생성하게 하세요.
하셨으면, 범위 2~12까지 내에서 무작위로 수를 생성하게 하세요.
(1~15랜덤수, 20~26랜덤수 도 해보기)
즉, 난수 함수에서 원하는 값 생성하기 -랜덤 범위를 구하는 공식 알아볼 것!
http://colorscripter.com/s/QE8ZWqY - 사용자가 몇 번만에 난수를 맞추는 지 알려주는 프로그램을 작성하자
http://colorscripter.com/s/ra9R8zN - 동전 앞 뒤 맞추기 게임을 만들어보자
http://colorscripter.com/s/L2LAmcr - 컴퓨터와 가위바위보 하는 게임을 만들어보자
http://colorscripter.com/s/jI3N6GI
문제 4번 활용편!
위에 연산했던 내용들은 안보여줘도 될 것 같아요...할 경우 사용!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> int main(void) { int com, user; srand((unsigned)time(NULL)); while(1) { com=rand()%2+1; printf("==============동전게임ver1.0==============\n"); printf("숫자를 입력하세요. (1.앞면 2.뒷면) : "); scanf("%d", &user); if (user==com) printf("맞췄습니다.\n"); else printf("틀렸습니다.\n"); //system("pause"); 멈춰주세요 Sleep(1000); //1초 있다 다음 문장 Windows.h 헤더 파일필요 system("cls"); //지워주세요 } } | cs |
system("pause"); 멈춰주세요
system("cls"); 지워주세요
수동으로 엔터나 스페이스 누르지 않고 자동으로 1초뒤에 지워지게 만들고 싶으면
Sleep(1000); 1초 있다가
system("cls"); 지워주세요
잘 활용한다면 반짝반짝 기능으로 사용 가능!!!
여유 있을 경우 집에서 베스킨라빈스 31 게임 만들어보세요!!!
반응형
'BOX' 카테고리의 다른 글
C 14Day (20160126) (0) | 2016.01.31 |
---|---|
C 13Day (20160125) (0) | 2016.01.27 |
C 11Day (20160121) (0) | 2016.01.22 |
C 10Day (20160120) (0) | 2016.01.22 |
C 9Day (20160119) (0) | 2016.01.21 |
블로그의 정보
jennysgap
jennysgap