easy software

C언어 rand() / srand()와 time.h를 사용하여 난수를 출력해보자 본문

C언어/기타

C언어 rand() / srand()와 time.h를 사용하여 난수를 출력해보자

JAVA 웹개발자 2015. 1. 31. 15:25

안녕하세요. 이번시간에도 rand()함수를 이용하여 난수를 출력해보겟습니다.

 

저번 글에서는 단순히 rand()를 이용해서 의사난수를 출력했었는데요, 문제가 있었죠?

 

여러번 컴파일해도 동일한 값만 출력이 되는 것이 문제였습니다.

 

그럼, 이번시간에는 컴파일을 할 때마다 난수가 재생성되는 방법을 소개해 드리겠습니다.

 

 

 

srand()를 이용해보자

 

srand()도 stdlib.h 에 선언되어있는 함수입니다.

 

형태는 void srand( unsigned int seed ); 입니다.

 

양의정수 seed값을 인자로 전달하게 되는데요, seed란 뜻은 씨앗이죠?

 

씨앗을 인자로 전달해서 srand()함수에 심어줍니다.

 

그리고 그 씨앗을 rand()함수를 통해 사용하면 됩니다.

 

즉, 사용자는 seed값을 입력해서 원하는 난수를 계속 생성해 낼 수 있는것이죠.

 

 

#include <stdio.h>

#include <stdlib.h>

 

int main(void){

int seed;

 

printf("씨드 값 입력 : ");

scanf_s("%d", &seed);

srand(seed); //씨앗심기

 

for(int i = 0; i < 5; i++)

printf("정수 출력 : %d \n", rand()); //열매 수확

 

return 0;

}

 

 

위의 코드를 보시면 사용자로부터 값을 입력받아 srand()에 전달하고,

 

그 이후에 rand()를 통해 난수를 출력하고 있습니다.

 

위와 같이 하시면 컴파일을 할 때마다 난수가 계속 바뀌는 것을 알 수 있습니다.

 

그런데 문제는, 매번 사용자 한테 입력을 받아서 난수를 생성해야 하는 불편함이있죠?

 

그런 문제를 해결하기위해서 여러분의 컴퓨터현재시간을 가져오도록 해보겠습니다.

 

컴퓨터시간은 계속 변경이되니 난수또한 계속 달리 나올 것입니다.

 

time.h에 선언되어있는 time()을 사용해보도록 합시다.

 

이 함수는 1970년 1월 1일 이후의 시간부터 현재까지의 시간차를 초 단위로 계산하여 반환합니다.

 

 

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h> //time()함수를 사용하기 위해 추가

 

int main(void){

 

srand((int)time(NULL)); //현재 시간을 이용해서 씨드 설정

 

for(int i = 0; i < 5; i++)

printf("정수 출력 : %d \n", rand()); //열매 수확

 

return 0;

}

 

 

위의 코드를 실행해보시면 실행할 때 마다 다른 난수를 확인 하실 수 있습니다.

 

그럼 이번에는 간단한 예제를 해보도록 하죠.

 

두 개의 주사위를 던졌을 때 그 결과를 매번 다르게 출력해주면 됩니다.

 

 

#include <stdio.h>
#include <stdlib.h> //rand()함수를 사용하기 위해 추가
#include <time.h> //컴퓨터의 현재시간을 가져오기 위해 추가

 

int main(void){

 

     srand((int)time(NULL)); //현재 시간을 이용해서 씨드 설정
 
     for (int i = 0; i < 2; i++)
         printf("%d ", rand() % ((6 - 1) + 1) + 1);

 

     return 0;
}

 

 

이전글에 소개해드렸던 원하는 난수를 구하는 공식을 이용하면 간단히 해결할 수 있습니다.

Comments