下面的代码意味着在间隔[1,100]中生成一个由5个伪随机数组成的列表。我在 default_random_engine
中引入了 time(0)
,它返回 Unix 时间中的系统时间。当我使用 MicrosoftVisualStudio2013在 Windows7上编译和运行这个程序时,它按预期工作(见下文)。然而,当我在 Arch Linux 中使用 g + + 编译器这样做时,它的行为很奇怪。
在 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分钟,并再次尝试发现,第一个数字已经改变,现在总是生成为一个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;
}