O código a seguir tem como objetivo gerar uma lista de cinco números pseudo-aleatórios no intervalo [1.100]. Eu semeio o default_random_engine
com time(0)
, que retorna a hora do sistema em tempo unix . Quando eu compilo e executo este programa no Windows 7 usando o Microsoft Visual Studio 2013, ele funciona como esperado (veja abaixo). Quando faço isso no Arch Linux com o compilador g ++, no entanto, ele se comporta de maneira estranha.
No Linux, 5 números serão gerados a cada vez. Os últimos 4 números serão diferentes em cada execução (como geralmente será o caso), mas o primeiro número permanecerá o mesmo.
Exemplo de resultado de 5 execuções no Windows e 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
Para aumentar o mistério, esse primeiro número incrementa periodicamente em um no Linux. Depois de obter os resultados acima, esperei cerca de 30 minutos e tentei novamente para descobrir que o primeiro número havia mudado e agora estava sempre sendo gerado como 26. Ele continuou a aumentar em 1 periodicamente e agora está em 32. Parece corresponder com a alteração do valor de time(0)
.
Por que o primeiro número raramente muda entre as execuções e, quando muda, aumenta em 1?
O código. Ele imprime perfeitamente os 5 números e a hora do sistema:
#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)
?