멀티쓰레드 함수에서 srand(time(NULL))은 충분히 다른가요?

조회수 1956회

C언어에서 흔히 랜덤값을 발생시킬 때 srand(time(NULL))을 넣어 주고는 합니다. 시간을 씨드로 주어서 랜덤값을 만드는 것으로 아는데,

4코어 8쓰레드 환경에서 8쓰레드를 동시에 발생시킵니다. 이 쓰레드가 일제히 랜덤을 발생시키는데 문제는 얘들이 같은 걸 지나치게 반복하는 것은 아닐까 우려스럽습니다. 쓰레드 간 미세한 시간 차이는 있겠지만, 이게 기본적으로 동시에 돌리다 보니 혹 시간의 씨드 자체가 같아서 서로 같아서 무의미한 쓰레드의 발생이 되는 것은 아닐까 합니다.

시간을 씨드로 주는 것의 정밀도에 대해서, 이 부분에 대해서 고민해 보신 분 있으면 고견 부탁드립니다.

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    srand() 를 통해 설정한 시드 값은 모든 쓰레드가 공유합니다. 즉, 쓰레드 별로 srand() 를 호출한다하여도, 마지막 호출로 설정된 시드가 전체 프로그램에서 사용되게 됩니다.

    쓰레드가 time() 을 호출할 때 시간이 차이가 나던 나지 않던, 결국 시드는 동일하게 되어 rand() 호출로 각 쓰레드가 동일한 순서의 숫자를 받을 일은 생기지 않습니다.

    모든 쓰레드가 시드에 상관 없이 난수를 발생하는 방법으로 Linux의 /dev/random 이나 Windows 의 CryptGenRandom 을 확인 해보세요.

    C++ 가 가능하시다면 random_device 를 사용하는 방법도 있습니다.

    • 엉엉 날 가져요 광자 2017.10.16 10:16

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)