학교 과제 풀다가 의문이 들어서 묻는건데
이 함수를 걍 main() 안에서 쓸 때는 잘 작동해. 문제는 이 함수가 다른 함수에서 쓰이고 이 함수를 main()에서 여러번 호출할 때야.
이때는 rand() 함수의 리턴값이 맨 처음 이후로는 난수가 아니게 되어버려.
무슨 소리나면 첫 숫자는 아무도 예상할 수 없으니 난수가 맞음.
그런데 두 번째 숫자부터는 첫 숫자를 초항으로 하는 등차수열(사실 완전한 등차수열은 아니지만)로 숫자가 나온다는거야.
만약 첫 숫자가 67이 나왔다면 67, 70, 73, 76, 79... 이따구로 숫자가 나온다는거야.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
int randomNumber(void){
srand(time(NULL));
return rand();
}
int main(void){
while(1){
printf("%d ", randomNumber());
Sleep(1000);
}
return 0;
}
테스트를 위해 만들어본 1초 간격으로 난수를 하나 생성해 출력하는 코드야.
일부러 14번째 printf 함수의 인자로 그냥 rand()를 쓰지 않고 main()함수 밖에 randomNumber()라는 함수를 하나 더 만들어서 인자로 넘겨줬음.
실제로 실행해본 결과는 이래.
이거 왜 그러는거냐?? 다른 해결방법은 있음?? 컴파일러는 gcc 4.9.2 버전 사용중임. 검색해보니까 관련 정보가 없어서 프갤에 질문해봄.
srand는 한번만 해주면됩니다
아하
시드값
전에는 for 안에다 srand 박는 애가 있더니 이번엔 while이네
;; 이해해주삼
rand는 선형합동법이라 그럼 선형 합동법 자체가 지극히 단순한 알고리즘이다보니 그런 것
근데 그러면 난수를 여러번 만들수는 없는거임?? - dc App
ㄴㄴ. srand()를 main() 안에서 딱 한번만 호출해주면 가능함