El progtwig genera los mismos números aleatorios en cada ejecución?

Acabo de terminar de progtwigr un juego tipo Minesweeper, y todo está bien, excepto que cada vez que ejecuto la aplicación, genera el mismo número (lo ejecuté 3 veces diferentes, guardé la salida en 3 archivos de texto y usé el comando diff en Linux, no encontró ninguna diferencia). Se siembra por time(NULL) por lo que debería cambiar cada vez, ¿no?

Aquí está mi código:

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; } 

Está sembrado por tiempo (NULL)

Si es así, no puedo verlo. De hecho, una búsqueda en su código no arroja nada. El comportamiento predeterminado, si no siembra explícitamente, es el mismo que si lo hubiera seminado con el valor 1.

Debe indicar explícitamente algo como:

 srand (time (NULL)); 

al comienzo de main algún lugar (y asegúrese de hacer esto una sola vez).

Sin embargo, tenga en cuenta que esto depende de la hora actual: si comienza varios trabajos en el mismo segundo (o cualquiera que sea su resolución de tiempo), comenzarán con la misma semilla.

Desde el estándar C (en el cual C ++ se basa para estas características de compatibilidad):

La función srand usa el argumento como una semilla para que una nueva secuencia de números pseudoaleatorios sea devuelta por llamadas subsecuentes a rand. Si se llama a srand con el mismo valor inicial, se repetirá la secuencia de números pseudoaleatorios. Si se llama rand antes de realizar cualquier llamada a srand, se generará la misma secuencia que cuando se llama primero a srand con un valor inicial de 1.

Necesitas sembrar aleatorizador. Llamar a srand() al principio.

Para agregar a las respuestas de otros, puede usar el algoritmo Mersenne Twister, que es parte de la biblioteca C ++ 11. Se está convirtiendo rápidamente en un estándar en muchos softwares comunes para generar números aleatorios.

Por ejemplo, esta es la función que escribí, que uso a menudo para generar números aleatorios en mis otros códigos:

  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_distribution distribution(0,1); // Specifying the type of distribution you want std::vector randarray(matsize,0); // Saving random numbers to an array for (int i=0;i 

En resumen: C ++ 11 tiene algunas características excelentes para las operaciones numéricas y sería una buena idea buscarlas. En cuanto a Mersenne Twister, http://en.wikipedia.org/wiki/Mersenne_twister