รหัสด้านล่างนี้มีไว้เพื่อสร้างรายการตัวเลขสุ่มหลอกห้าหมายเลขในช่วงเวลา [1,100] ฉันเมล็ดdefault_random_engine
ด้วยtime(0)
ซึ่งจะส่งกลับเวลาของระบบในเวลายูนิกซ์ เมื่อฉันรวบรวมและเรียกใช้โปรแกรมนี้บน Windows 7 โดยใช้ Microsoft Visual Studio 2013 มันทำงานได้ตามที่คาดไว้ (ดูด้านล่าง) อย่างไรก็ตามเมื่อฉันทำใน Arch Linux ด้วยคอมไพเลอร์ g ++ มันทำงานแปลก ๆ
ใน Linux จะมีการสร้างตัวเลข 5 ตัวในแต่ละครั้ง ตัวเลข 4 ตัวสุดท้ายจะแตกต่างกันในแต่ละการดำเนินการ (ซึ่งมักจะเป็นเช่นนั้น) แต่ตัวเลขแรกจะยังคงเหมือนเดิม
ตัวอย่างผลลัพธ์จากการดำเนินการ 5 ครั้งบน Windows และ 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
เมื่อเพิ่มความลึกลับแล้วตัวเลขแรกนั้นจะเพิ่มขึ้นเป็นระยะ ๆ บน Linux หลังจากได้ผลลัพธ์ข้างต้นฉันรอประมาณ 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)
?