Il codice seguente ha lo scopo di generare un elenco di cinque numeri pseudo-casuali nell'intervallo [1,100]. Semina il default_random_engine
con time(0)
, che restituisce l'ora di sistema in unix tempo . Quando compilo ed eseguo questo programma su Windows 7 utilizzando Microsoft Visual Studio 2013, funziona come previsto (vedi sotto). Quando lo faccio in Arch Linux con il compilatore g ++, tuttavia, si comporta in modo strano.
In Linux, verranno generati 5 numeri ogni volta. Gli ultimi 4 numeri saranno diversi ad ogni esecuzione (come spesso accade), ma il primo numero rimarrà lo stesso.
Output di esempio da 5 esecuzioni su 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
Aggiungendo al mistero, quel primo numero aumenta periodicamente di uno su Linux. Dopo aver ottenuto le uscite di cui sopra, ho aspettato circa 30 minuti e ho provato di nuovo a scoprire che il 1 ° numero era cambiato e ora veniva sempre generato come 26. Ha continuato ad aumentare periodicamente di 1 ed ora è a 32. Sembra corrispondere con il valore variabile di time(0)
.
Perché il primo numero cambia raramente tra le serie e poi, quando lo fa, aumenta di 1?
Il codice. Stampa ordinatamente i 5 numeri e l'ora di 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)
?