C: rand() 와 srand() 로 난수 만들기
C 언어에서 난수를 만들 때 가장 널리 쓰이는 함수는 rand() 와 srand() 이다. 이 글에서는 이 두 함수의 사용법과 활용법을 알아보고 한계와 대안에 대해서 다루려고 한다. 1. rand() rand() 함수의 원형은 다음과 같다. #include <stdlib.h> int rand(void); rand() 함수는 [0, RAND_MAX] 범위(0과 RAND_MAX 포함)에서 정수 형태의 의사-난수(pseudo-random number)를 만든다. RAND_MAX 는 rand() 가 만드는 난수의 최대값으로, C 라이브러리에 따라 다르다. 다만, 최소 크기는 0x7FFF(=32767, 15비트)로 보장된다. 1-1. 원하는 범위내의 난수 만들기 rand() 함수는 [0, RAND_MAX] 범위의 난수를 만든다. 하지만, 실제로 필요한 범위는 이와는 다르다. 예를 들어, [10, 20] 사이의 난수를 만들려면 어떻게 해야 할까? 보통 두 가지 방법이 알려져 있다. 하나는 나머지 연산(%) 을 이용하는 것이고, 다른 하나는 비례 관계 를 이용하는 것이다. 1-1-1. 나머지 연산을 이용하는 방법 나머지 연산을 이용하는 방법부터 알아보자. 나머지 연산을 이용하면 [0, n) 범위(0 포함, n 비포함)를 얻을 수 있다. 예를 들어 n=7 이라면, 어떤 값이 오더라도 7로 나눈 나머지는 결국 0 이상 6 이하의 정수이다. 여기에 적당한 값을 더해 주면 우리가 원하는 범위의 난수를 얻을 수 있다. 이를 함수로 나타내면 다음과 같다. Colored By Color Scripter ™ 1 2 3 4 int randrange( int a, int b) { return (rand() % (b - a + 1)) + a; } 하지만, 이 방법의 경우 난수가 고르게 만들어지지 않는다는 문제점이 있다. 예를 들어, 난수가 만들어지는 범위는 [0, 8] 이지만, 원하는 범위는 [0, 5] 라면, 나머지 연산에는 6 이 쓰인다