Si llama al rand()
sin llamar primero al srand()
, actuará como si hubiera llamado srand(1)
implícitamente. El bit correspondiente de la norma C99 7.20.2.2 The srand function
(sobre la que se basa cstdlib
) afirma:
Si rand se llama antes se han hecho llamadas a srand, la misma secuencia se genera como cuando srand se llama en primer lugar con una semilla valor de 1.
En otras palabras, usted será obtener la misma secuencia cada vez. Puede cambiar su main
en:
int main (int argc, char* argv []) {
srand (time (0)); // needs ctime header.
for (int i = 0; i < 5; i++)
cout << random (2, 5) << endl;
wait();
}
de solucionar este problema, suponiendo que no se ejecutan más de una vez por segundo.
Como se mencionó, necesitará el encabezado ctime
para esto. También debe extraer en cstdlib
ya que es donde viven rand
y srand
. También suele ser una buena idea usar los encabezados cXXX
en lugar de los XXX.h
(cmath
en lugar de math.h
, por ejemplo).
Así, después de haber hecho todas las esos cambios (y el uso de espacios de nombres explícitos, que yo prefiero, aunque otros no pueden), que iba a terminar con:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
void wait() {
int e;
std::cin >> e;
}
int random (int low, int high) {
if (low > high) return high;
return low + (std::rand() % (high - low + 1));
}
int main (int argc, char* argv []) {
std::srand (std::time (0));
for (int i = 0; i < 5; i++)
std::cout << random (2, 5) << '\n';
wait();
}
que da una secuencia diferente cada vez que lo ejecutarlo, por algunas veces de todos modos. Obviamente, hay un límite estricto sobre cuándo se repetirán los datos (solo hay 4 posibilidades) y la naturaleza "aleatoria" de la salida significa que también puede repetirse antes de esa fecha :-)
Nit: Matemáticamente, eso no los hará "más aleatorios". –
Es cierto, pero en el contexto de la pregunta del OP ... (más está entre comillas ;-) – John3136