C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

스폰서 링크

C에서, rand 함수는 0에서 RAND_MAX (대부분의 경우 32767)까지의 정수를 반환합니다. 0에서부터 시작하는 것이 아니라, 파라미터로 지정해 준, 하한값과 상한값 사이의 숫자에서 난수를 출력하려면, 다음의 randomRange 함수를 사용하면 됩니다.

"상한값 - 1"까지가 아니라 정확히 상한값까지입니다. 즉, 2에서 5까지 지정했다면, 2, 3, 4, 5 이렇게 2~5를 출력합니다. 좀더 직관적으로 사용할 수 있게끔 하기 위해서입니다.

randomRange(하한값, 상한값)

이렇게 지정합니다.

지정해준 범위 내에서만, 난수 구하기 예제

소스 파일명: example.cpp
(비주얼 C용 소스입니다.)

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

int randomRange(int n1, int n2);

int main(void) {
  srand(GetTickCount()); // 난수 발생기 초기화

  // -3에서 +3까지 범위의 정수를 랜덤하게 20개 출력
  for (int i = 1; i <= 20; i++)
    printf("%d\n", randomRange(-3, 3));

  return 0;
}

// 지정된 범위의 정수 1개를 램덤하게 반환하는 함수
// n1 은 "하한값", n2 는 상한값
int randomRange(int n1, int n2) {
  return (int) (rand() % (n2 - n1 + 1)) + n1;
}

컴파일 및 실행 결과 화면:

D:\Z>cl example.cpp && example.exe
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.

example.cpp
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:example.exe
example.obj
2
-1
1
2
1
2
-2
1
0
-3
2
2
3
3
0
0
-3
-3
0
0

D:\Z>

▶▶ C언어] 랜덤 숫자 (난수 정수) 출력 - Random Numbers rand srand 함수

☞ C/C++ (VC++)

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.

블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면

C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong
주소를 리더기에 등록하시면 됩니다.

C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

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

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

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

카드를 뽑는다던지

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

등등 생각만 해도 많죠!

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

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

바로! 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());
}

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

C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong
C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

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

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

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

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

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

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

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

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

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

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

생각하시면 됩니다

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

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

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

이는 마치..

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

이 문장이 생각나네요..

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

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

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

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

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

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

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

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

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

C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong
C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

서로 다른 수가 나오네요!

근데 말했다시피 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);
}
C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

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));
}
C언어 rand 범위 지정 - ceon-eo rand beom-wi jijeong

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

만약에 확률을 할것이라면

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% 확률로 수행!
    }
}

이렇게 하면 되겠네요!

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

다음에봐요~~~