Der folgende Code soll eine Liste von fünf Pseudozufallszahlen im Intervall [1.100] generieren. Ich setze das default_random_engine
mit time(0)
, was die Systemzeit in Unix-Zeit zurückgibt . Wenn ich dieses Programm unter Windows 7 mit Microsoft Visual Studio 2013 kompiliere und ausführe, funktioniert es wie erwartet (siehe unten). Wenn ich dies in Arch Linux mit dem g ++ - Compiler mache, verhält es sich jedoch seltsam.
Unter Linux werden jedes Mal 5 Zahlen generiert. Die letzten 4 Zahlen sind bei jeder Ausführung unterschiedlich (wie es häufig der Fall ist), aber die erste Zahl bleibt gleich.
Beispielausgabe von 5 Ausführungen unter Windows und 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
Hinzu kommt, dass diese erste Zahl unter Linux regelmäßig um eins erhöht wird. Nachdem ich die obigen Ausgaben erhalten hatte, wartete ich ungefähr 30 Minuten und versuchte erneut festzustellen, dass sich die erste Zahl geändert hatte und nun immer als 26 generiert wurde. Sie wurde in regelmäßigen Abständen um 1 erhöht und liegt nun bei 32. Es scheint zu entsprechen mit dem sich ändernden Wert von time(0)
.
Warum ändert sich die erste Zahl selten über Läufe hinweg und erhöht sich dann, wenn dies der Fall ist, um 1?
Der Code. Es druckt die 5 Zahlen und die Systemzeit sauber aus:
#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;
}
default_random_engine
dies auf diesen beiden Plattformen völlig unterschiedlich ist.
sizeof(time_t)
gegensizeof(default_random_engine::result_type)
?