멀티쓰레드 함수에서 srand(time(NULL))은 충분히 다른가요?
조회수 1956회
C언어에서 흔히 랜덤값을 발생시킬 때 srand(time(NULL))을 넣어 주고는 합니다. 시간을 씨드로 주어서 랜덤값을 만드는 것으로 아는데,
4코어 8쓰레드 환경에서 8쓰레드를 동시에 발생시킵니다. 이 쓰레드가 일제히 랜덤을 발생시키는데 문제는 얘들이 같은 걸 지나치게 반복하는 것은 아닐까 우려스럽습니다. 쓰레드 간 미세한 시간 차이는 있겠지만, 이게 기본적으로 동시에 돌리다 보니 혹 시간의 씨드 자체가 같아서 서로 같아서 무의미한 쓰레드의 발생이 되는 것은 아닐까 합니다.
시간을 씨드로 주는 것의 정밀도에 대해서, 이 부분에 대해서 고민해 보신 분 있으면 고견 부탁드립니다.
1 답변
-
srand()
를 통해 설정한 시드 값은 모든 쓰레드가 공유합니다. 즉, 쓰레드 별로srand()
를 호출한다하여도, 마지막 호출로 설정된 시드가 전체 프로그램에서 사용되게 됩니다.쓰레드가
time()
을 호출할 때 시간이 차이가 나던 나지 않던, 결국 시드는 동일하게 되어rand()
호출로 각 쓰레드가 동일한 순서의 숫자를 받을 일은 생기지 않습니다.모든 쓰레드가 시드에 상관 없이 난수를 발생하는 방법으로 Linux의 /dev/random 이나 Windows 의 CryptGenRandom 을 확인 해보세요.
C++ 가 가능하시다면 random_device 를 사용하는 방법도 있습니다.
댓글 입력