본문 바로가기

프로그래밍./C언어.

[C언어] 랜덤함수 사용법. rand(), srand() 간단예제.

[C언어] 랜덤함수 사용법. rand(), srand() 간단예제.
C언어에서는 랜덤수 발생을 위해서 rand()와 srand()를 주로 사용한다.
아직 학생이라 실무나 이런 부분에서 어떤지는 잘 모르겠지만.
사실 rand는 딱히 쓸모는 없을거 같다. 해본 사람은 알겠지만

rand의 경우 랜덤으로 발생하긴 하지만 실행시 매번 같다는 점이 문제다.
5개의 랜덤수를 발생했다. 종료 후 다시 실행하면 이전과 동일한 랜덤수가 발생한다.
랜덤수 발생의 기초가 되는 seed (씨앗)이 동일하기 때문이라고 한다.
이러한 문제점을 보안하는 방법으로 srand()가 있다. 일단 기본부터 하자.

rand(), srand()는 stdlib.h 에 정의 되어 있으므로 #include <stdlib.h>를 반드시 선언해 주어야 한다.




기본적으로 0 ~ ???? 꽤 큰 수까지 나온다. max 라고 가정하자.


위와 같이 꽤나 크게 나온다. 그래서 범위를 조절할 필요가 있는데
%(mod) 연산자를 사용해서 범위를 지정한다. %10을 해줌으로써 0~(10-1) 까지 지정이 된다.



% 연산자를 아는 사람이라면 이해 하겠지만, 사실 그냥 외워도 상관은 없다 - -;
다만, % 연산자가 랜덤 함수의 범위를 지정하기 위해 존재 하는 것은 아니라는건 알아야 한다.
궁금 하다면 아래 링크를 참조하자.

[C언어] %연산자, Mod 연산자란? 간단 예제.


이렇게 max의 범위를 줄였음에도 불구하고 몇가지 조절할 필요가 있다.
랜덤수는 0 ~ max 이기 때문에 0 도 나온다. 하지만 일반적으로
우리는 0을 많이 사용하지 않는다. 그래서 1부터 랜덤수를 구하고 싶을지도 모른다.

랜덤수에 +1을 해준다. 0 ~ max 에서, 0+1 ~ max+1 이 된것이다.

이것으로 초기 값도 정해줄 수 있게 되었다. 이 전의 사진과 비교해 보면 전체적으로
1씩 증가된 것을 알 수 있다. 단, 위에서 10이 나온 이유는 원래 1 ~ 9을 구하자면
(rand()%9) + 1 또는 (rand() % (10-1)) + 1 을 해줘야 맞다.

전체적으로 1씩 증가 이기 때문에 %9로 해서 0~8까지의 범위를 지정하고 +1을 해서
1 ~ 9까지 해주어야 한다. 내가 지정한 최대값도 같이 +1 되기 때문이다.


그리고 제일 처음 이야기 했던, 계속 같은 값이 나온다는 문제점.
위의 두 사진을 비교해 보자. 분명 코드를 수정해서 새로 결과를 찍었으나
+1이 된것 말고, 기본적으로 랜덤수는 동일하다. 몇 번을 해도 계속 동일한 값이 나온다.



srand()를 이용해서 이를 해결하자.

srand()는 랜덤수의 기반이 되는 값을 변경 해 주는 것이다. 하지만 어차피 동일한 seed 값에는
동일한 랜덤수가 나오기 때문에 이를 자동으로 변경 해 주기 위해서 time을 사용한다.
이를 사용해서 계속 다른 seed 값을 정해 줄 수 있다.
time은 time.h에 정의 되어 있으므로 #include <time.h>를 선언해 주어야 한다.



아래는 부가적인 기능이다.

( rand() % (b-a+1) ) +1     +1이 빠졌습니다.


define을 사용해서 조금 더 편하게(?) 사용할 수 있다.
define을 모른다면 아래 링크에서 참조 하자. 귀찮으면 그냥 기억하고 있다가 필요시 똑같이 적어도 된다.

define란? define 사용법. 간단 예제.


( rand() % (b-a+1) ) +1     +1이 빠졌습니다. 


Rnd(최소, 최대) 랜덤 수의 최소와 최대를 바로 지정해 버리는 방법이다.
여러 범위의 랜덤 수가 필요한 경우 유용할 수 있겠다.

b-a을 하는 이유는 위에서 설명했지만. 만약 5~10의 랜덤수를 원한다면.
일단 최대 값을 %11 로 최대 값을 (11-1)로 변경 해줘야 한다. 0 ~ 10
그리고 +5 를 해서 최소 값을 0에서 5로 변경 해줘야 한다.

하지만 그러면 5 ~ 15 가 되어 버린다. 때문에 애초에 최대 값을 원하는 값에서 최소 값을 빼주어야 한다.
%6을 해서 (6-1)을 최대로 잡는다. 0 ~ 5, 거기에 +5을 해주면 5 ~ 10 이 되는 것이다.

(10 - 5 +1) 이 되어야 6이 나오고, %6 이 계산되서 0~5까지가 나오겠죠?^^


유용한 정보가 되셨다면 아래의 손가락 버튼 한번 눌러주세요 ^-^