본문 바로가기

C

([C언어] 25강) 랜덤 (rand, srand함수와, rand함수 최댓값)

 

 

이번시간에는 게임개발에 절대 빠지지않는것!

 

랜덤에 대해서 배워보겠습니다

 

게임에는 랜덤이라는것이 엄청나게 많이 들어가는데요!

 

카드를 뽑는다던지

 

몬스터를 잡았을때 랜덤으로 일정확률로 아이템을 준다던지

 

등등 생각만 해도 많죠!

 

그 랜덤을 한번 만들어보려합니다!

 

랜덤으로 숫자를 뽑아주는 함수가 있는데요!

 

바로! rand함수입니다

 

rand함수는 stdlib.h 헤더에 정의되어있습니다

 

우선 rand함수에 대해서 알아볼까요?

 

rand()함수는 호출하면 0 ~ 32767의 값중에 랜덤으로 리턴 해줍니다

 

(rand함수의 최댓값은 stlib.h 헤더에 RAND_MAX라는 define으로 선언되어있습니다)

 

자 그럼 한번 사용해볼게요!

 

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

int main()
{
	printf("%d",rand());
}

 

이 코드를 두번 실행해봅시다!

 

 

어라? 분명 0~32767중에 랜덤이랬는데 우연히 41이 두번나온걸까요?

 

아닙니다. rand함수가 뽑아주는 수는 프로그램을 껏다켜도 변하지않습니다.

 

정말 랜덤으로 하고싶다면 srand함수를 통해서 rand함수를 초기화시켜주어야 하는데요

 

rand함수가 만약 처음 켰을때 배열로 [5,7,8,6,4]라는 값이 지정되고

 

rand함수를 호출할때마다 하나씩 5, 7, 8, 6, 4 이렇게 보내준다고 칩시다

 

그 배열이 프로그램을 껏다 켜도 바뀌지가 않는다는겁니다.

 

그 배열을 새로 매치해주는 함수가 srand함수라고 보시면 편할겁니다!

 

srand함수의 사용법은 이렇습니다

 

srand(number);

아까 말했다 싶이 rand함수는 [5, 7, 8, 6, 4] 이런식의 배열을 가지고있다고 생각하자 했습니다

 

srand함수는 그 배열을 새로 만들어주는것이 아니라 자신이 가지고있는 다른 배열로 교체를 한다고

 

생각하시면 됩니다

 

그래서 srand함수의 매개변수인 number에 0을 입력하면 srand! 너가가진 0번배열로 교체해줘!

 

라고 하는것이라 보면 됩니다.

 

그럼 완전한 랜덤을 얻으려면 srand함수에도 일정하지 않은 수를 넣어줘야하고

 

이는 마치..

 

가위를 샀더니 가위 포장을 뜯기위해 가위가 필요하다

 

이 문장이 생각나네요..

 

그럼 우리는 어떻게 하면 될까요??

 

프로그램을 킬때마다 시간이 똑같지는 않을겁니다!

 

그래서 srand함수에 number 매개변수는 현재시간으로 넣어주면 되겠네요!

 

현재 시간을 받아오는 함수는

 

time();

함수이고, time.h헤더에 정의되어있습니다.

 

그럼 한번 완전한 랜덤값을 만들어볼까요?

 

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

int main()
{
    srand((unsigned int)time(NULL));
    printf("%d",rand());
}

위 코드를 두번 연속으로 실행 해보겠습니다!

 

서로 다른 수가 나오네요!

 

근데 말했다시피 rand함수는 0~32767범위의 랜덤정수를 리턴한다고 했습니다

 

나는 0 ~ 20이면 충분한데 0 ~ 32767은 너무 큰것같네요.. 어떻게 해야할까요?

 

바로! 나머지 연산자를 사용하면 됩니다!

 

여기서는 우리가 수학적으로 조금 접근을 해야하는데요

 

어떤 수 % 20 하면 나오는수는 0 ~ 19로 일정합니다!

 

어떤 수 % 100 하면 나오는 수는 0 ~ 99겠죠!

 

어떤 수 % 100을 했는데 만약 어떤 수에 100이 나왔다면 결과는 0이되니까요!

 

그럼 0 ~ 20이라면 rand() % 21을 하면되겠네요

 

해볼까요?

 

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

int main()
{
    srand((unsigned int)time(NULL));
    printf("%d",rand() % 21);
}

20을 안넘는 모습을 볼수 있죠!

 

그럼 조금 다르게 10 ~ 20이라는 범위중에 랜덤으로 나오도록 해보겠습니다.

 

어떻게 해야할까요??

 

최솟값 + ( rand() % (최댓값 - 최솟값 + 1) )

 

이렇게 하면 어떻게 될까요?

 

10에서 20사이에는 10개의 숫자가 들어가므로

 

rand() % 11을 해서 0~10의 숫자를 랜덤으로 뽑은 후

 

최솟값인 10을 더해주면

 

10~20의 랜덤수가 나오게 되겠네요! 해볼까요?

 

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

int main()
{
    srand((unsigned int)time(NULL));
    printf("%d",10 + (rand() % 11));
}

정상적으로 잘 나오는걸 볼 수 있습니다

 

만약에 확률을 할것이라면

 

70%확률로 일정 코드를 수행하고 싶을때

 

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

int main()
{
    srand((unsigned int)time(NULL));
    int percent = rand() % 100;
    if(percent < 70) {
    	//70% 확률로 수행!
    }
}

 

이렇게 하면 되겠네요!

 

이해하셨나요? 그럼 오늘은 여기까지하고 다음 강좌에서 뵙는거로 하겠습니다!

 

다음에봐요~~~