반응형
우선 코드 먼저
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int i=0,random=0;
srand((int)time(NULL)); //현재시간 사용해서 시드설정
while(i<3)
{
random= rand()%6+1; //난수를 random에 임의할당
//난수의 범위는 0~5에서 0+1~5+1 즉 1~6입니다
printf("주사위 %d의 결과 %d\n",i,random);
i++;
}
return 0;
}
처음 코딩을 했을때 저는 while 안에 srand((int)time(NULL)을 넣었고 while문이 돌아가면서 srand가 계속해서 새로 설정되어야 새로운 난수가 생긴다고 생각했었습니다. 그런데 srand에 대해서 검색해본 결과
- time 함수의 기준은 1초라는 것
- srand를 이용하여 seed값을 변경하면 추출 순서가 초기화 된다는 것
을 간과하였습니다. while문 안에 srand를 넣는다면 while이 반복되는 시간이 1초 안이기에 새로운 시간이 할당되지 않았습니다. 즉 0.1초만에 while이 여러번 돌아가기에 srand가 씨드로 계속 같은 값을 가진다는 것입니다. 또한 srand를 이용하여 씨드값을 변경하였지만 변경값이 같음으로 추출 순서가 같은 씨드값을 기준으로 초기화 되었기에 계속해서 같은 숫자가 반복되었습니다.
0을 씨드값으로 4 9 10 14 와 같이 난수가 발생하고, 1을 씨드값으로 49 23 59 20와 같이 난수가 발생한다고 한다면 제가 위에서 짠 while문 밖에 srand를 넣은 코드는 0을 씨드값으로 첫번째인 4 출력 -> 두번째인 9를 출력 한 것이고 while문 안에 srand를 넣는다면 0을 씨드값으로 첫번째인 4를 출력 -> 시간이 바뀌지 않았음으로 다시 0을 씨드값으로 초기화 -> 추출순서가 초기화 되어 다시 0을 씨드값으로 첫번째인 4를 출력 하게 된 것입니다.

반응형
'개발 공부 > C언어' 카테고리의 다른 글
#17 [열혈 C 프로그래밍] 도전! 프로그래밍2 - 1번, 2번, 3번, 4번 (0) | 2022.08.04 |
---|---|
#16 C언어 *의 피연자는 포인터여야 하는데 Int 형식이 있음 오류 (0) | 2022.08.04 |
#14 C언어 반복문과 조건문에서의 break; continue; return;의 차이점 (0) | 2022.08.02 |
#13 C언어 변수형태/상수형태 배열과 포인터의 차이점과 공통점 (0) | 2022.08.02 |
#12 C언어 포인터 앞에 int double 같은 자료형을 붙여줘야 하는 이유 (0) | 2022.08.02 |
댓글