Если вы позвоните по номеру rand()
без предварительного звонка srand()
, он будет действовать так, как если бы вы позвонили srand(1)
неявно. Соответствующий бит стандарта C99 7.20.2.2 The srand function
(на котором основан cstdlib
) гласит:
Если рэнд вызывается перед вызовом 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();
}
, который дает другую последовательность каждый раз, когда я запустите его несколько раз. Очевидно, что существует жесткий предел, когда данные будут повторяться (есть только), а «случайный» характер выхода означает, что он может повториться и до этого :-)
Nit: Математически это не сделает их «более случайными». –
Правда, но в контексте вопроса OP ... (плюс это в кавычках ;-) – John3136