Le programme génère-t-il les mêmes nombres aléatoires à chaque exécution?

Je viens de finir de coder un jeu de type Minesweeper, et tout va bien, sauf que chaque fois que je lance l’application, le même nombre est généré (je l’ai exécuté 3 fois, sauvegardé la sortie dans 3 fichiers texte et utilisé la commande diff sous Linux, il n’a trouvé aucune différence). Il est semé par le time(NULL) , il devrait donc changer à chaque fois, non?

Voici mon code:

main.cpp

 #include  #include  #include  #include  #include "Minesweeper/box.h" #include  int main(int argc, char** argv){ using namespace std; bool gameOver = false; int x, y, score = 0; const int HEIGHT = 10; const int WIDTH = 10; unsigned int Time = time(0); cout << "Welcome to Minesweeper. " << endl; //setup grid Box grid[10][10]; for(int i = 0; i < WIDTH; i++) for(int n = 0; n < HEIGHT; n++){ unsigned int value = rand() %100 + 1; cout << value << endl; if(value <= 38){ grid[i][n].setFill(MINE); //cout << i << "," << n << " is mined." << endl; } else grid[i][n].setFill(EMPTY); } for(int r = 0; r < WIDTH; r++) for(int l = 0; l < HEIGHT; l++) if(grid[r][l].getFill() == EMPTY) cout << r << "," << l << " - EMPTY." << endl; else if (grid[r][l].getFill() == MINE) cout << r << "," << l << " - MINE." << endl; while(!gameOver){ cout << "Enter coordinates (x,y): "; scanf("%i,%i",&x,&y); if(grid[x][y].getFill() == MINE) gameOver = true; else{ cout << "Good job! (You chose " << x << "," << y << ")" << endl; score++; } } cout << "You hit a mine! Game over!" << endl; cout << "Final score: " << score << endl; getchar(); return EXIT_SUCCESS; } 

C’est semé par le temps (NULL)

Si c’est le cas, je ne peux pas le voir. En fait, une recherche dans votre code ne renvoie rien. Le comportement par défaut, si vous ne spécifiez pas explicitement, est identique à celui que vous aviez défini avec la valeur 1.

Vous devez indiquer explicitement quelque chose comme:

 srand (time (NULL)); 

au début de main quelque part (et assurez-vous de le faire une fois et une fois seulement).

Cependant, gardez à l’esprit que cela dépend de l’heure actuelle. Si vous démarrez plusieurs tâches en une seconde (ou quelle que soit votre résolution temporelle), elles commenceront par la même valeur de départ.

A partir du standard C (sur lequel C ++ est basé pour ces fonctionnalités de compatibilité):

La fonction srand utilise l’argument comme germe pour qu’une nouvelle séquence de nombres pseudo-aléatoires soit renvoyée par des appels ultérieurs à rand. Si srand est alors appelé avec la même valeur de départ, la séquence de nombres pseudo-aléatoires doit être répétée. Si rand est appelé avant que des appels à srand aient été effectués, la même séquence sera générée que lorsque srand est appelé pour la première fois avec une valeur de départ égale à 1.

Vous devez semer un randomiseur. Appelez srand() au début.

Pour compléter les réponses par d’autres, vous pouvez utiliser l’algorithme Mersenne Twister, qui fait partie de la bibliothèque C ++ 11. Il devient rapidement un standard dans de nombreux logiciels courants pour générer des nombres aléatoires.

Par exemple, c’est la fonction que j’ai écrite, que j’utilise souvent pour générer des nombres aléatoires dans mes autres codes:

  std::vector mersennetwister(const int& My,const int& Mz, const int& Ny,const int& Nz) { int ysize = (My + 2*Ny + 1); int zsize = (Mz + 2*Nz + 1); int matsize = ysize*zsize; unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); // Seeding the generator with the system time std::mt19937_64 generator (seed); // Calling the Mersenne-Twister Generator in C++11 std::uniform_real_dissortingbution dissortingbution(0,1); // Specifying the type of dissortingbution you want std::vector randarray(matsize,0); // Saving random numbers to an array for (int i=0;i 

Conclusion: C ++ 11 possède d’excellentes fonctionnalités pour les opérations numériques et il serait judicieux de les examiner. En ce qui concerne le Twister Mersenne, http://en.wikipedia.org/wiki/Mersenne_twister