이번 글에서는, C언어 rand 함수와 srand 함수에 대해서 알아보도록 하겠습니다. 이들에 대한 자세한 원리는 추후에 따로 알고리즘이나 이산수학 카데고리에서 다룰 기회가 있을 듯 싶습니다. 먼저, srand는 1번째 인자로 seed 값만을 받습니다. 그리고, rand 함수는 아무런 인자를 받지 않고, 그냥 (유사)난수만 리턴합니다. 사용법은 그리 복잡하지 않은 듯 싶으니, 프로그램을 한 번 실행시켜 보도록 합시다.

 

 


 먼저, 시드 값을 0으로 주고, rand 함수를 10번 호출해 보았습니다.

 

 

 그랬더니, 1804289383, 846930886, ... , 1189641421이 나왔음을 알 수 있어요. 프로그램을 여러 번 실행 시켜도 동일한 결과가 나왔습니다. 그것으로 미루어 보았을 때 처음 시드값에 따라서, 나오는 수들이 달라질 수도 있다는 걸 의미합니다.

 

 

 이제 시드값을 10으로 줘 봅시다. 어떻게 결과가 달라졌을까요?

 

 

 1215069295, 1311962008, ... , 679162307. seed 하나 다르게 넣었을 뿐입니다. 그러면, 프로그램이 실행이 될 때 마다, random하게 수를 뽑았을 때, 나오는 수들이 달라지게 하려면 어떻게 하면 좋을까요? 실행이 되는 시간마다 seed 값을 다르게 주면 끝날 거에요. 보통, 교과서에서는 time(NULL)을 많이 넣습니다.

 

 

 이런 식으로요. 여기서. time(NULL)은 1초마다 1씩 증가하는 값입니다. 그러니, 프로그램을 실행 시키고 나서, 5초 후에 실행시키면 시드 값이 5가 증가했기 때문에, 다른 값이 나옵니다.

 

 기준 시간으로부터 1초가 지나면 time(NULL)의 리턴값은 1, 2초가 지나면 2가 리턴되는데요. 제가 이 포스팅을 쓰는 시간에서 기준 시간을 빼면, 1577930990이 나옵니다. 생각보다 꽤 큰 수인데요. 기준 시간이 한국 시간으로 1970년 1월 1일 오전 9시이니, 그럴 수 밖에 없을 듯 싶네요.

 

 

 특정 시점에, 실행시켜 보니, 1495568841, 1294774501, ... , 1627880867이 나왔습니다.

 

 

 시간이 흐른 어느 시점에서 다시 실행시켜 보니, 또 다른 값들이 나왔습니다. 이를 통해, seed 값이 다르면 다른 (유사) 난수 패턴이 나온다는 것을 확인할 수 있습니다. 이것을 set 하는 것이 srand 함수다. 정도로만 알고 있어도 무난하고요.

 

 


 이제 로또 번호를 생성하는 프로그램을 만들어 보도록 하겠습니다. 이 번호는 [1, 45] 범위이니까, 대충 rand 함수의 리턴 값에 44로 나눈 나머지에 1을 더한 값을 취하면 될 겁니다.

 

 이것을 코드로 표현하면 위와 같습니다.

 

 

 그런데, 29, 4, 21, 12, 21, 41. 21이 중복으로 나왔다는 것을 알 수 있어요. 중복 없이 뽑는 방법은 없을까요?

 

 

 배열이라는 자료구조를 이용하면 매우 간단합니다. 뽑은 수는 1로 set 하고, 그렇지 않은 수는 0으로 set 하면 되기 때문입니다. 만약에 수의 범위가 매우 커진다면, array 대신에 hashmap이나, map, set 계열의 자료구조를 써야 할 수도 있습니다만, 고작 [1, 45]입니다. 45개 정도면 int형 배열로 처리해도 충분히 돌아갑니다.

 

 

 11번째 줄 flag[r]은 r이 뽑혀져 있느냐를 검사합니다. 만약에 뽑혀져 있다면, continue 문으로 13 ~ 15번째 줄을 무시합니다. 그렇지 않다면, 해당 수를 뽑고, flag[r]의 값을 1로 set 합니다.

 

 

 중복 없이 제대로 나오는 것을 확인할 수 있습니다.