Đoạn mã dưới đây nhằm tạo ra một danh sách gồm năm số giả ngẫu nhiên trong khoảng thời gian [1.100]. Tôi gieo hạt default_random_engine
với time(0)
, trả về thời gian hệ thống trong thời gian unix . Khi tôi biên dịch và chạy chương trình này trên Windows 7 bằng Microsoft Visual Studio 2013, nó hoạt động như mong đợi (xem bên dưới). Tuy nhiên, khi tôi làm như vậy trong Arch Linux với trình biên dịch g ++, nó hoạt động rất lạ.
Trong Linux, 5 số sẽ được tạo mỗi lần. 4 số cuối cùng sẽ khác nhau trên mỗi lần thực hiện (như thường lệ), nhưng số đầu tiên sẽ giữ nguyên.
Ví dụ đầu ra từ 5 lần thực thi trên Windows và Linux:
| 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
Thêm vào bí ẩn, số đầu tiên đó tăng dần theo định kỳ trên Linux. Sau khi có được các kết quả đầu ra ở trên, tôi đợi khoảng 30 phút và thử lại để thấy rằng số đầu tiên đã thay đổi và bây giờ luôn được tạo dưới dạng số 26. Nó đã tiếp tục tăng lên 1 theo chu kỳ và bây giờ là 32. Nó có vẻ tương ứng. với giá trị thay đổi của time(0)
.
Tại sao số đầu tiên hiếm khi thay đổi qua các lần chạy, và sau đó khi số đó tăng lên 1?
Mật mã. Nó in ra 5 số và thời gian hệ thống một cách gọn gàng:
#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)
vssizeof(default_random_engine::result_type)
?