본문 바로가기
개발 공부/C언어

#15 C언어 [도전! 프로그래밍3/4번] srand 여러번 쓰면 안되는 이유

by 반달bear 2022. 8. 2.
반응형

 

우선 코드 먼저

#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에 대해서 검색해본 결과 

 

 

  1. time 함수의 기준은 1초라는 것
  2. 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를 출력 하게 된 것입니다.

 

 

반응형

댓글