본문 바로가기
C & C++/C & C++

rand() 함수

by izen8 2010. 4. 26.
반응형
rand() 함수는 난수, 즉 일정하지 않은 소위 말하는 랜덤한 수를 뽑아주는 함수입니다.
간단한 사용법을 알아볼까요?

일단 정수형 변수 i 가 선언되어 있다고 보시고...

1. 기본 사용법

i = rand()%n

이것은 0 ~ n-1 범위의 난수를 i에 대입합니다.

예를 들어 n=6 이라 하면 0, 1, 2, 3, 4, 5, 중 하나가 i에 대입되는 셈이지요.

2. 기본 응용
i = rand()%n + m

이것은 1번을 응용한 것으로, 0+m ~ n-1+m 범위의 난수를 i에 대입합니다.
예를 들어 n=6, m=4 라 하면 4, 5, 6, 7, 8, 9, 중 하나가 i에 대입되는 셈이지요.
다 른 예로 n=5, m= -2 라 하면 -2, -1, 0, 1, 2 중 하나가 i에 대입되는 것이죠.

i = rand()%n * m

이것은 0 ~ n-1 으로 나올 수 있는 수에 m을 곱한 수를 i에 대입하는 식입니다.

예를 들어 n=4, m=2 이라 하면, 0, 2, 4, 6 중 하나가 i에 대입되는 것이죠.

m 의 값을 2로 주면 2의 배수, 3을 주면 3의 배수가 나오는군요.

이제 두개를 섞어서,

i = (rand()%n + m) * o

이것은 0+m ~ n+m-1 으로 나올 수 있는 난수에 o을 곱한 수를 i에 대입하는 식입니다.

n = 3, m = 2, o = 4 라 하면, 8, 12, 16 중 하나가 i에 대입되는 것이죠.

이것도 어떤 수의 배수를 사용할 때 용이하겠습니다.

i = rand()%n * m + o

이건 0 ~ n-1 으로 나올 수 있는 수에 m을 곱하고, o를 더한 수를 i에 대입하는 식입니다.
n = 3, m = 2, o = 5 라 하면, 5, 7, 9 중 하나가 i에 대입되는 것이죠.

3. 기본 심화 응용

i = rand()%n * m + o

이 식을 다시 한번 봅시다.

n의 값이야 0 이상으로 주고, m = 2, o = 0 으로 주면, 짝수가 생성됩니다.

m = 2, o = 1 으로 주면, 홀수가 생성되는것을 볼 수 있습니다.


4. 배열을 이용한 응용 - 1 기본 기법

배 열을 이용한 응용이라...  rand() 의 마법을 보실 수 있겠군요.

int ar[MAX] = {원하는 원소 MAX개}; 라는 배열이 있다고 생각하고...


i = ar[rand()%MAX]

이 식은 상당히 유용합니다. 예를 들어보는게 제일 빠르겠지요.

MAX = 4로 잡고, ar 배열의 원소를 { 2, 5, 9, 3214324 } 이라 합시다.

저 4개의 숫자는 규칙성도 뭣도 없어서 위에서 본 응용법으로는 뽑아 낼 수가 없지요.

하지만 배열과 4번의 식을 이용한다면?

rand()%MAX 는 0 ~ MAX-1 범위의 수를 뽑아낼 것입니다.

MAX 가 4니까 0, 1, 2, 3, 이 나오겠지요? 그런 다음에 ar[rand()%MAX] 으로 ar배열 속에 있는 원소에 접근하는데...

rand()%MAX 가

0 이면 2

1 이면 5

2 이면 9

3 이면 3214324

를 i 에 대입할 수 있는거죠.

이렇게 배열을 이용하면 rand() 함수 한번의 호출로 불규칙한 수를 난수로 뽑아내 쓸 수 있는거죠.

응용법은... 아래쪽에 있습니다.

5. 배열을 이용한 응용 - 2 자세한 응용

이 번엔 다른 배열 응용법을 알아봅시다.

복권을 만들었는데, 1/10 의 확률로 1등, 3/10의 확률로 2등, 6/10의 확률로 3등이라고 하고,

rand() 를 이용해 랜덤하게 추첨을 하려고 하는데..

" 3가지 경우가 있으니 rand()%3 해서 0 이면 1등, 1이면 2등... "

이런 생각은 떙 !!!!

0, 1, 2, 가 나올 확률은 같습니다!!!

" 그럼 rand()%10 해서 0 은 1등, 1~3 은 2등, 4~9 는 3등으로... 이런 복잡한 걸"

정답인데, 이러면 조건문이 들어가야 하는 복잡함이!!!!

배 열 하나면 됩니다.

int ar[10] = { 1, 2, 2, 2, 3, 3, 3, 3, 3, 3 }

이런 배열 하나 준비 하시고!!!!

 

i = ar[rand()%10]

아 하하하하하, 이러면 끝 !! i에는 추첨된 등수가 들어가게 됩니다.

설명해 드리죠.

 

rand()%10 으로 나올 수 있는 수는

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 이고, 이 10가지 수가 나올 수 있는 수학적 확률은 같습니다.

 

그러나, 0이 나올 확률은 1/10,

1, 2, 3 이 나올 학률은 3/10,

4, 5, 6, 7, 8, 9 가 나올 확률은 6/10  !!!

 

배열 원소를 보면, ar[0] 은 1이고

ar[1] ~ ar[3]은 2,   ar[4] ~ ar[9]는 3!!!!

 

배 열로는 이런일이 가능합니다 !!!

 

 

6. 실제 응용 !!!!!!

이런 프로그램이 있다고 해봅시다.

랜덤으로 학생번호를 뽑아 여러가지 처리를 하고,

다시 랜덤으로 뽑는데 한번 뽑힌 학생번호를 뽑으면 안되는.. 그런 프로그램!!!

 

한숨이 절로 나오나요?

 

일단 예제를 봅시다.

시간상 전략 후략 본체만...

 

int ar[10] = { 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010 }; // 학번 저장 배열

int i;  // 랜덤으로 뽑힌 학번을 저장하는 변수

int a; // 랜덤으로 뽑힌 학번 원소 위치, 쉽게 말해 ar[] 안의 수

for ( int loop=0 ; loop < 10 ; loop++ )

{

      for (  ;;  ) // i 가 0이 아닐때까지 추첨을 계속

      {

            a = rand()%10;

            i = ar[a]; // 랜덤 추첨

            if ( i != 0 )

                  break;

      }

  

      printf("%d 학번 당첨\n",i);

      /* 여기서 부터 여러가지 처리를 한다. 학교 추첨이라던지 그런거... */

      ar[a] = 0; // 이게 중요, 처리 완료된 학번을 0으로 바꿔 놓는다.

}


//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int begin, end;
int i, num;
srand(time(NULL));
while(1)
{
printf("시작값을 입력하세요 : ");
scanf("%d", &begin);
printf("종료값을 입력하세요 : ");
scanf("%d", &end);
for(i = 0; i < 20; i++)
{
num = rand() & (end - begin + 1) + begin;
printf("%d\n", num);
}
printf("\n");
}
}
 
//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ//ㅡ,ㅡ


반응형

'C & C++ > C & C++' 카테고리의 다른 글

[멤버함수] MFC 주요 클래스 멤버함수, 변수  (0) 2011.01.26
[Etc] HDD 용량출력  (0) 2011.01.12
문장에서 문자수 계산하는 프로그램  (0) 2009.12.18
string.h에 있는 함수들에 대한 설명  (0) 2009.12.18
stdafx.h  (0) 2009.12.18

댓글