Kode di bawah ini dimaksudkan untuk menghasilkan daftar lima nomor pseudo-random dalam interval [1.100]. Saya menyemai default_random_engine
dengan time(0)
, yang mengembalikan waktu sistem dalam waktu unix . Ketika saya mengkompilasi dan menjalankan program ini di Windows 7 menggunakan Microsoft Visual Studio 2013, ini berfungsi seperti yang diharapkan (lihat di bawah). Ketika saya melakukannya di Arch Linux dengan kompiler g ++, bagaimanapun, itu berperilaku aneh.
Di Linux, 5 angka akan dihasilkan setiap kali. 4 angka terakhir akan berbeda pada setiap eksekusi (seperti yang sering terjadi), tetapi angka pertama akan tetap sama.
Contoh keluaran dari 5 eksekusi di Windows dan 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
Menambah misteri, angka pertama itu bertambah satu secara berkala di Linux. Setelah mendapatkan keluaran di atas, saya menunggu sekitar 30 menit dan mencoba lagi untuk menemukan bahwa angka pertama telah berubah dan sekarang selalu dihasilkan sebagai 26. Angka ini terus bertambah 1 secara berkala dan sekarang menjadi 32. Tampaknya sesuai dengan nilai perubahan time(0)
.
Mengapa angka pertama jarang berubah saat berjalan, dan jika berubah, bertambah 1?
Kode. Ini dengan rapi mencetak 5 angka dan waktu sistem:
#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)
vs.sizeof(default_random_engine::result_type)
?