Приведенный ниже код предназначен для создания списка из пяти псевдослучайных чисел в интервале [1,100]. Я семя default_random_engine
с time(0)
, который возвращает системное время в unix time. Когда я компилирую и запускаю эту программу в 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;
}