랜덤값 사용할 때 time함수 이해가 안 됩니다.

time함수로 seed값을 정하면 어쨌든 seed값은 하나의 수가 되잖아요? 그런데 왜 랜덤값을 출력할 때마다 값이 다르게 나올까요…?
time함수를 쓰지 않고 seed값을 그냥 무작위의 수로 정했을 때는 출력할 때마다 같은 값이 나오는데…
한 번 실행할 때 혹시 시간이 달라지나 싶어서 아래코드를 실행해봤는데 seed값이 위, 아래에서 동일하게 나오더라고요.
어떻게 이해하면 될까요?

int main() {

unsigned int seed{ static_cast<unsigned int>(time(0)) };
srand(seed);


cout << rand() % 6 + 1 << endl;
cout << seed << endl;


cout << rand() % 6 + 1 << endl;
cout << seed << endl;

return 0;

}

time(0)은 현재 시간을 반환하는 함수입니다.
운영 체제의 경우 현재 시간이 1970년 1월 1일을 기준으로 초 단위로 설정됩니다.
따라서 매번 time(0)을 실행할 때 마다 값이 달라집니다.
실행 시간은 매번마다 달라지니 다른 seed 값이 들어가게 됩니다.

무작위의 숫자를 넣는다고 하더라도, 그 숫자는 매번 같으니 매번 실행할 때 마다 같은 random 값이 나오게 됩니다.

답변 감사합니다. 그런데 저는 하나의 프로그램에서 두 개의 랜덤값을 출력할 때 다른 값이 출력되는 것이 이해가 안 돼서 질문드린거였습니다… 왜냐하면 time함수로 seed값을 정한다 하더라도 한 번의 프로그램 실행에 걸리는 시간이 매우 짧기 때문에 두 개의 출력문을 실행할 때의 seed값이 같기 때문입니다.

cout << seed << endl;


cout << rand() % 6 + 1 << endl;
cout << seed << endl;

rand()는 seed 값을 바꾸지 않습니다.

Test code

#include <chrono>
#include <iostream>
#include <thread>

using namespace std;
using namespace std::chrono_literals;

int main(int argc, char** argv) {

  unsigned int seed = static_cast<unsigned int>(time(0));
  cout << seed << endl;

  this_thread::sleep_for(1s);
  seed = static_cast<unsigned int>(time(0));
  cout << seed << endl;

  this_thread::sleep_for(2s);
  seed = static_cast<unsigned int>(time(0));
  cout << seed << endl;

  this_thread::sleep_for(3s);
  seed = static_cast<unsigned int>(time(0));
  cout << seed << endl;

  return 0;
}

Result

1592484695
1592484696
1592484698
1592484701

seed값은 어떤 난수표를 사용할지 정하고,
rand함수를 호출하면 난수표에서 하나씩 반환합니다.

선형합동법에 대해서 공부해 보세요