열혈C 도전프로그래밍3 도전3,4

ROK·2022년 7월 20일
0

rand()로 난수 생성

C에서 난수를 생성하는 방법

  • #include <stdlib.h> 헤더파일 호출
  • rand()를 사용한다.

난수 코드

#include <stdio.h>
#include <stdlib.h>

int main() {
	int i;
    
    printf("0부터 %d까지 난수 생성 \n", RAND_MAX);
    for (i=0; i<5; i++) {
    	printf("난수 출력 : %d \n", rand());
	}
    
    return 0;
}

위 코드에서 RAND_MAX는 랜덤으로 생성하는 최대값을 의미한다.

실행하면 결과값으로 아래와 같이 나온다

0부터 32767까지 난수 생성
난수 출력 : 41
난수 출력 : 18467
난수 출력 : 6334
난수 출력 : 26500
난수 출력 : 19169

난수가 다 같다??

근데 결과값이 여러번 실행을 해도 전부 같다
이게 말이 난수지 항상 같은 난수가 나와서 이거는 난수라고 하기는 너무 애매하다

srand()와 time()

이를 해결하기 위해 srand()함수를 사용한다.

srand()는 time()과 함께 사용한다
srand(time(NULL));

코드를 설명하자면 srand() 함수는 rand 함수에 무작위 시드값을 주기 위한 함수이고, 그 파라미터로 time(NULL)을 전달했다.

time(NULL)은 1970년 1월 1일 이후 경과된 시간을 초 단위로 반환하는 함수
즉, 1초 단위로 매번 다른 시드값을 생성해 rand()함수로 호출한다

이게 진짜 난수를 생성하는 방법이다.
단, time()을 사용하기 위해 #include <time.h>를 추가해줘야 한다.

srand(time(NULL));을 사용한 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
	srand(time(NULL));
	for (int i=0; i<5; i++) {
    	printf("%d ", rand()%10+1);
    }
}

처음에 착각을 한게 rand()대신 srand()를 사용하는 줄알았는데 그게 아니라 위에서 선언을 해주는 거였음

참고로

rand()%10 + 1

위 코드는 0이상 10이하의 난수를 출력하도록 해준다.

seed 변경으로 사용하기

일단 코드를 확인하자

#include <stdio.h>
#include <stdlib.h>

int main() {
	int seed;
    printf("seed 입력 : \n");
    scanf("%d", &seed);
    
    srand(seed);
    for(int i=0; i<5; i++) {
    	printf("난수 출력 : %d \n", rand());
	}
    return 0;
}    

위 코드는 seed를 입력해 다른 난수를 뽑아 내는 코드이다
물론 seed가 같으면 같은 난수가 출력될 것이고 seed를 다르게 주면 다른 난수가 출력된다.

결론

rand(), srand(), time() 무려 헤더를 3개나 부르고 함수도 3개를 사용해야해서 귀찮아 다른 방법이 없는지 찾아봤는데

예~ 그런건 없습니다 이 정도는 짧은 편이니 그냥 같이 묶어서 생각하는게 좋다고 합니다.

그리고 글이 도전 프로그래밍인데 난수 관련 정리만 한 것 같다. 근데 글 안에 정답이 다 있음

profile
하루에 집중하자

0개의 댓글