반응형

안녕하세요

만약 게임에서 몬스터가 랜덤한 위치에 나오게 하거나,
상자를 열었을 경우 랜덤하게 아이템이 나오게 하려면 어떻게 구현을 해야할까요??
오늘은 이러한 경우에 난수(Random)값을 추출하는 함수에 대해 이야기하려고 합니다.

 

rand

함수 원형
int rand();

헤더 파일
stdlib.h

리턴값
0에서 32,767까지 값이 리턴됩니다.
0~RAND_MAX(0~32767) 
RAND_MAX값이 32767(16진수로 0x7fff)로 정의되어있습니다.

예제

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
 
void main()
{
    for ( int i = 0; i < 10; i++ )
        printf("%d\n", rand());
}
cs

문제점
예제를 여러번 실행해보면 항상 값이 같다는 것을 확인할 수 있습니다.
프로그램이 실행될 때마다 rand함수 호출 시 다른 값을 호출하기 위해서는 srand함수를 이용해야합니다.

srand

함수 원형
void srand(unsigned int _Seed);

헤더 파일
stdlib.h

리턴값
없습니다.

설명
Seed를 다른 값을 넣어주면 rand호출 시 마다 다른 값을 리턴해줄 수 있습니다.
시드에 상수를 넣어버리면 의미가 없기 떄문에 time함수를 넣어서 시간마다 다른 시드가 들어가도록 합니다.
time함수를 사용하기 위해서는 time.h 헤더파일을 추가해줘야합니다.

예제

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    srand((unsigned)time(NULL));
    for ( int i = 0; i < 10; i++ )
        printf("%d\n", rand());
}
 
cs

 

응용하기

1~3 랜덤값 추출하기
rand값에 3으로 나눈 나머지를 구하면 0~2까지 값이 나오고 여기서 1을 더해줍니다.

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    srand((unsigned)time(NULL));
    for ( int i = 0; i < 10; i++ )
        printf("%d\n", rand()%3+1);
}
cs

 

중복값이 없도록 난수 생성

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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    srand((unsigned)time(NULL));
    int nResult[10= { 0, };
    int nCount = 0;
    int nNum = 0;
    bool bExist = false;
    while(nCount < 10 )
    {
        bExist = false;
        nNum = rand() % 10 + 1;
        for (int i = 0; i < 10; i++)
        {
            if (nNum == nResult[i])
                bExist = true;
        }
 
        if (!bExist)
        {
            nResult[nCount++= nNum;
        }
            
    }
    for ( int i = 0; i < 10; i++ )
        printf("%d\n", nResult[i]);
}
cs

 

반응형

+ Recent posts