딩굴댕굴

C 12Day (20160122)

by jennysgap

BOX

난수(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

 




문제!

  1. rnad 함수를 이용하여 0~32767의 범위 중 무작위 수를 생성하는데, 원하는 수 만큼 임의로 출력하고 싶다면 어떻게 해야하는지 찾아보세요
    http://colorscripter.com/s/O60LOsr

  2. 임의의 수를 0~9의 범위 내에서 무작위로 수를 생성하게 하세요.
    하셨으면, 범위 2~12까지 내에서 무작위로 수를 생성하게 하세요.
    (1~15랜덤수, 20~26랜덤수 도 해보기)
    즉, 난수 함수에서 원하는 값 생성하기 -랜덤 범위를 구하는 공식 알아볼 것!
    http://colorscripter.com/s/QE8ZWqY

  3. 사용자가 몇 번만에 난수를 맞추는 지 알려주는 프로그램을 작성하자
    http://colorscripter.com/s/ra9R8zN

  4. 동전 앞 뒤 맞추기 게임을 만들어보자
    http://colorscripter.com/s/L2LAmcr

  5. 컴퓨터와 가위바위보 하는 게임을 만들어보자
    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 게임 만들어보세요!!!









20160122 c언어 12day.txt






반응형

'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

활동하기