如果您在未先致电srand()
的情况下致电rand()
,它将会如同隐式调用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();
}
赋予不同的顺序,每次我无论如何,运行它几次。显然,数据重复的时间有很长的限制(只有4种可能性),输出的“随机”特性意味着它可能在此之前重复:-)
Nit:数学上,这不会让他们“更随机”。 – 2012-02-27 10:51:11
的确如此,但是在OP的问题中......(加上引号;-) – John3136 2012-02-27 23:48:41