Если вы позвоните rand()
без предварительного вызова srand()
, он будет действовать так, как если бы вы позвонили srand(1)
неявно. Соответствующий бит стандарта C99 7.20.2.2 The srand function
(на котором основан cstdlib
) гласит:
Если rand вызывается до того, как были сделаны какие-либо вызовы srand, генерируется та же последовательность, что и при первом вызове srand со начальным значением 1.
Другими словами, вы будете каждый раз получать одну и ту же последовательность. Вы можете изменить свой main
на:
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 ();
}
чтобы исправить это, при условии, что вы запускаете его не чаще, чем раз в секунду.
Как уже упоминалось, для этого вам понадобится заголовок ctime
. Вы также должны потянуть cstdlib
, поскольку там живут rand
и srand
. Также обычно рекомендуется использовать заголовки cXXX
, а не XXX.h
(например, cmath
вместо math.h
).
Итак, сделав все эти изменения (и используя явные пространства имен, которые я предпочитаю, а другие нет), я бы получил:
#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 ();
}
, который дает другую последовательность при каждом запуске, в любом случае, несколько раз. Очевидно, что существует жесткое ограничение на то, когда данные будут повторяться (имеется только 4 5 возможностей), а «случайный» характер вывода означает, что он может повторяться и раньше: -)