Le code ci-dessous est destiné à générer une liste de cinq nombres pseudo-aléatoires dans l'intervalle [1,100]. J'ai des graines de l' default_random_engine
avec time(0)
, ce qui ramène le système de temps en temps unix. Quand j'ai compiler et exécuter ce programme sur Windows 7 à l'aide de Microsoft Visual Studio 2013, il fonctionne comme prévu (voir ci-dessous). Quand je le fais dans Arch Linux avec le compilateur g++, cependant, il se comporte étrangement.
Dans Linux, 5 numéros sera généré à chaque fois. Les 4 derniers chiffres seront différentes à chaque exécution (comme ce sera souvent le cas), mais le premier numéro reste le même.
Exemple de sortie de 5 exécutions sur Windows et 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
Ajouter au mystère, qui est le premier nombre périodiquement incrémente de un sur Linux. Après l'obtention de la au-dessus de sorties, j'ai attendu environ 30 minutes et a de nouveau essayé de trouver que le 1er numéro a changé, et maintenant a toujours été généré comme une 26. Il a continué à augmenter par tranche de 1 périodiquement et est maintenant à 32. Il semble correspondre à l'évolution de la valeur de time(0)
.
Pourquoi le premier numéro rarement les modifications à travers les pistes, et quand il le fait, par incrément de 1?
Le code. Il parfaitement imprime les 5 numéros et le temps de système:
#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;
}