아래 코드는 간격 [1,100]에서 5 개의 의사 난수 목록을 생성하기위한 것입니다. 나는 시스템 시간을 유닉스 시간으로 반환 하는 default_random_engine
with를 시드합니다 . Microsoft Visual Studio 2013을 사용하여 Windows 7에서이 프로그램을 컴파일하고 실행하면 예상대로 작동합니다 (아래 참조). 그러나 g ++ 컴파일러로 Arch Linux에서 그렇게하면 이상하게 작동합니다.time(0)
Linux에서는 매번 5 개의 숫자가 생성됩니다. 마지막 4 개의 숫자는 각 실행마다 다르지만 (종종 그렇듯이) 첫 번째 숫자는 동일하게 유지됩니다.
Windows 및 Linux에서 5 개 실행의 출력 예 :
| Windows: | Linux:
---------------------------------------
Run 1 | 54,01,91,73,68 | 25,38,40,42,21
Run 2 | 46,24,16,93,82 | 25,78,66,80,81
Run 3 | 86,36,33,63,05 | 25,17,93,17,40
Run 4 | 75,79,66,23,84 | 25,70,95,01,54
Run 5 | 64,36,32,44,85 | 25,09,22,38,13
수수께끼에 덧붙여, 그 첫 번째 숫자는 Linux에서 주기적으로 1 씩 증가합니다. 위의 출력을 얻은 후 30 분 정도 기다렸다가 다시 1 번째 숫자가 변경되어 현재는 항상 26으로 생성되고 있음을 확인했습니다. 주기적으로 1 씩 계속 증가하여 현재 32에 해당하는 것 같습니다. 값이 time(0)
.
첫 번째 숫자가 실행 중에 거의 변경되지 않고 변경되면 1 씩 증가하는 이유는 무엇입니까?
코드. 5 개의 숫자와 시스템 시간을 깔끔하게 인쇄합니다.
#include <iostream>
#include <random>
#include <time.h>
using namespace std;
int main()
{
const int upper_bound = 100;
const int lower_bound = 1;
time_t system_time = time(0);
default_random_engine e(system_time);
uniform_int_distribution<int> u(lower_bound, upper_bound);
cout << '#' << '\t' << "system time" << endl
<< "-------------------" << endl;
for (int counter = 1; counter <= 5; counter++)
{
int secret = u(e);
cout << secret << '\t' << system_time << endl;
}
system("pause");
return 0;
}
sizeof(time_t)
비교는sizeof(default_random_engine::result_type)
?