Programming/C C++
C에서 무작위로 난수를 생성하려면 srand와 rand함수를 사용합니다.(이 함수는 stdlib.h Header File의 선언이 필요합니다.)

rand함수는 직접적으로 난수를 생성하는 역활을 하며 srand는 난수가 발생하는 초기값을 결정합니다.

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

main()
{
  srand(10);
 
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
}


srand()함수로 난수발생의 초기값을 10으로 하고 rand()를 5번 호출하여 난수발생을 확인합니다.


결과를 보시면 Program을 두번에 걸쳐 실행시켰지만 똑같은 난수가 생성되고 있습니다.

이는 난수발생의 기준값을 srand()함수를 통해 10으로 고정시켰기 때문인데 이러한 문제를 해결하려면 Program이 실행될때마다 초기값을 바꾸어 줘야 한다는 얘기가 됩니다. 이때 사용하는 가장 보편적인 방법이 시간함수를 이용한 것입니다.

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

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


시간을 srand()함수의 인수로 전달하여 난수초기값을 설정합니다.

참고 :
time()함수사용을 위해서는 time.h Header File선언이 필요합니다.

여기서 time()함수는 1970년 01월 01일 00시 00분 00초를 시작으로 하여 현재까지의 초수를 반환합니다.(unsigned는 time()함수가 반환하는 값을 좀더 넓게 수용하기 위함입니다.)


rand()가 발생하는 난수의 범위는 0 ~ RAND_MAX 까지입니다. RAND_MAX가 어디까지인지는 stdlib.h에 정의되어 있는데 대부분의 경우 32767로 정의되어 있습니다.
즉, 난수는 기본적으로 0이하나 또는 32767이상은 나올 수 없다는 의미가 됩니다.

만일 난수발생의 범위를 20이하로 제한하고자 한다면 난수로 발생되는 수치에서 20으로 나눈 나머지만을 출력하도록 하면 됩니다.

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

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


%연산자를 통해 rand()함수에 발생하는 값에 20을 나눈 후 나머지를 출력합니다.


위에서 처럼 나머지를 처리하도록 하면 최대치를 제한할 수 있습니다. 반대로 최소치를 제한하려면 다음 처럼 쓸 수 있습니다.

rand()%(최대수-최소수) + 최소수;

다음은 10이상 20이하의 범위로 난수가 발생하도록 작성된 예제입니다.

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

main()
{
  srand((unsigned)time(NULL));
 
  printf("%d\n", (rand()%(20 - 10)) + 10);
  printf("%d\n", (rand()%(20 - 10)) + 10);
  printf("%d\n", (rand()%(20 - 10)) + 10);
  printf("%d\n", (rand()%(20 - 10)) + 10);
  printf("%d\n", (rand()%(20 - 10)) + 10);
}


3 0