난수 함수(stdlib.h) 
 
난수(Random Number)란 무작위로 만들어지는 알 수 없는 값을 말합니다. 
어떤 값을 가지게 될 지 예측할 수 없는 수라는 뜻인데 이런 난수가 필요한 이유는 말 그대로 예측을 허용하지 않기 위해서입니다. 
 
 

int rand(void); 
void srand(unsigned int seed); 
 
 

rand 함수는 0~RAND_MAX 범위의 수 중에서 무작위로 한 수를 생성해 냅니다. 
RAND_MAX는 컴파일러에 따라 다르지만 일반적으로 32767(0x7ffff)로 정의되어 있습니다. 그래서 rand 함수를 호출하면 0부터 32767중의 임의의 정수 하나가 리턴 됩니다. 
 
 

예제2) 5개의 숫자를 랜덤하게 추출해주는 예제 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    int i; 
    printf("rand()의 결과는 0부터 %d까지의 랜덤한 수\n", RAND_MAX); 
    for(i=0; i<5; i++) 
    { 
        printf("[%d]번째 수: %d\n", i+1, rand()); 
    } 
    return 0; 
}

위의 예제는 5개의 랜덤한 수를 추출하지만 계속 수행해 보면 항상 동일한 결과를 출력합니다. 
rand 함수는 일정한 난수 생성 규칙(seed)에 따라 난수를 생성하는데 난수 생성 규칙이 항상 같기 때문에 난수가 생성되는 순서도 항상 같게 됩니다. 
난수 생성 규칙에 변화를 줄 수 있는 함수가 srand라는 함수입니다. 
srand는 난수 발생기에 난수를 발생시키는 시작점(seed)를 제공하며 난수 발생기는 이 시작점을 기준으로 하여 난수를 발생시키게 됩니다. 
따라서 시작점을 바꾸면 생성되는 난수도 달라집니다. 
즉 srand 함수의 매개변수로 정수 값을 넣어주면 생성되는 숫자가 달라지게 됩니다. 
그러나 이렇게 하더라도 시작점이 동일하면 생성되는 난수에는 일정한 규칙이 존재할 수밖에 없습니다. 
완전한 난수를 만들기 위해서는 난수 생성기에게 전달되는 시작점 또한 예측 불가능한 난수여야 합니다. 
이러한 이유로 시간 값을 시작점으로 사용한다면 완전한 난수를 만들 수 있습니다. 
따라서 위의 예제에 숫자를 추출해 내기 전에 
srand((unsigned)time(NULL)); 문장을 삽입하면 완전한 난수가 추출될 것 입니다. 
 
 

또한 일정한 범위 안의 난수를 추출할 수 도 있습니다. 
가령 1부터 10까지의 난수 추출이라면 
rand() % 10 +1 이렇게 하면 됩니다. 
 
 

예제3) 1부터 100까지 짝수만 5개 추출하는 예제 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
int main() 
    int i; 
    srand((unsigned)time(NULL)); 
    for(i=0; i<5; i++) 
    { 
        printf("[%d]번째 수: %d\n", i+1, (rand()%50+1)*2); 
    } 
    return 0; 
}
Posted by cyj4369
,