본문 바로가기
Work/개발 노트

개발 노트, rand() 함수의 사용

by ★용호★ 2015. 9. 3.

이 전에 N땡 회사에서 면접을 보면서 rand 함수에 대한 사용법에 대해 질문을 받았었다. 그 때는 rand 함수를 사용할 때 srand 해주지 않으면 동일한 값이 나올 수 있다는 답변을 했었는데 면접관은 그건 당연한거고 그걸 제외하고 당신 후배가 rand 함수를 사용하려 한다면 어떤 조언을 해주겠는가 라고 되물었다. 여기서 말문이 막혔었다. rand()를 잘 써야한다는건 알고 있었지만 왜 그럴까를 깊게 파본적이 없었다. 


이번에 회사 업무 중에 또다시 rand() 함수를 사용해야 하는 부분이 있어서 이 부분에 대한 테스트를 해보기로 했다. 우선은 단순하게 rand() 만을 사용한 결과이다. 




10만번을 돌린 결과를 보면 모두 같은 확률의 아이템들인데 1~3번째 품목이 확연하게 높은 확률로 당첨이 됐다. 4번째 항목도 높은 확률로 당첨된 것을 볼 수 있다. 이 의미는 rand()를 돌렸을 때 낮은 수의 값이 나올 확률이 높다는 의미이다. (당첨 로직을 모든 항목을 sum 한 값에 랜덤한 수에 해당하는 템을 선택하는 것이였으므로) 낮은 수가 더 잘걸리는 이유는 확실히는 모르겠다. 어쨌거나 불공평한 확률로 아이템이 당첨되고 있었다. 


이를 해결하기 위해서는 rand() 함수에 공평할 수 있도록 조작이 필요하다. 회사 내부에서 사용하는 방식(별건 아니지만 대외비 일지 모르니 공개는 안함)을 통해 다시 랜덤을 돌린 결과를 보면 




훨씬 공평해진 결과를 볼 수 있다. 


하지만 어쨌거나 srand와 rand를 이용한 확률 계산은 중복된 값이 나올 수 있는 확률이 있으므로 사용에 주의를 해야 한다. 이를 보완한 rand_s 가 있는데 스레드에 안전하고 srand를 사용하지 않아도 중복되지 않은 수가 나오는 것이 보장되지만 rand보다 속도가 느리다는 단점이 있다. 커뮤니티의 의견을 봐도 속도 때문에 rand를 쓰는 것이 낫다는 사람도 있고 rand는 쓰지 말아야 한다는 사람도 있다. 선택은 개발자의 몫인 듯.. 



참고 : C++에서 난수를 사용하는 방법


댓글