srand가 왜 여러번 실행이 안될까요??
소스내용입니다.
#include
#include
int Random();
int main()
{
int a, b,c, correct=0, incorrect=0, i;
for(i=0; i<10; i++)
{
a=Random();
b=Random();
printf("%d + %d = ", a, b);
scanf("%d", &c);
if(c == a+b)
{
printf("correct!!\n");
correct++;
}
else
{
printf("incorrect..\n");
incorrect++;
}
}
printf("correct num : %d , incorrect num : %d\n", correct, incorrect);
return 0;
}
int Random()
{
srand(time(NULL));
return rand()%100+1;
}
44 + 44 =
55 + 55 =
이런식으로 반복문 한번 마다 Random함수가 한번만 적용이되네요;;; 이유를 모르겠습니다. ㅠ
srand()는, rand() 함수를 실행하기 위한
srand()는, rand() 함수를 실행하기 위한 seed 값을 설정하는 함수입니다. 프로그램에서 (int)time(0) 값으로 한 번만 초기화해주어야 합니다.
보통 아래와 같이 씁니다.
저는 이렇게 생각했습니다.
감사합니다~
덕분에 궁굼한 문제점을 해결했습니다 ^^
> srand(time(NULL)); > return
> srand(time(NULL));
> return rand()%100+1;
>
> 반복문 한번 마다 Random함수가 한번만 적용이되네요;;; 이유를 모르겠습니다. ㅠ
>
time() 의 해상도는 1초 입니다.
random seed 를 같은 값으로 줄 경우, 초기화 이후의 randrom 열은 동일합니다.
코드 중간의 scanf("%d", &c)에 의한 지연 없이 for() 루프가 1초 안에 모두 수행될 경우,
작성하신 MakeRandom() 함수의 반환값은 모두 동일합니다.
반목문 한번 마다 Random 함수가 한번만 적용된 것이 아니라,
scanf("%d", &c) 에서 1초 이상 지연이 됐기 때문에 time(0) 값이 달라져서 random seed 가 변경되는 긍정적인 효과를 경험하셨을 뿐입니다.
프로그램을 통털어 random seed 는 한번만 주는 것이 효율적이고,
time(0) 를 seed 로 하셨을 경우엔 프로그램이 1초 안에 재실행되는 경우에 대한 고려까지 하셔야 합니다.
흠... 제가 잘 이해를 못하는건가 싶어서요 ㅋ
1초에 대해서는 정확히 이해를 했습니다 ^^
srand((int)time(0));
위에분의 답변처럼 이런식으로 한번만 실행을한후에 (함수안에다가 아니라 main에서 한번만 실행했습니다.)
그 이후에는 rand()만 써서 값을 리턴받아서 빼니까
1초안에 입력값을 마구 입력해도 똑같은 값은 출력이 안되네요 ^^
마지막에
>time(0)를 seed로 하셨을 경우엔 프로그램이 1초 안에 재실행되는 경우에 대한 고려까지 하셔야 합니다.
라는 말이 이해가 안되서 다시 답변 달았습니다 ^^
여기에 대해선 제가 답변 드려볼 수 있겠네요.
Brian W. Kernighan과 Dennis M. Ritchie가 저술한 The C Programming Language에서는,
srand 함수와 rand 함수의 내부가 다음과 같다고 설명하고 있습니다.
아래는 이를 이용해 작성해본 간단한 예제인데, 이를 콘솔에 출력해보시면 무슨 의미인지 이해하실 수 있을 것 같습니다.
저는 이렇게 생각했습니다.
댓글 달기