C++ 库有一个名为 rand() 的函数,每次调用该函数都将返回一个非负整数。要使用 rand() 函数,必须在程序中包含 <cstdlib> 头文件。但是,该函数返回的数字其实是伪随机数。这意味着它们具有随机数的表现和属性,但实际上并不是随机的,它们实际上是用算法生成的。
该算法需要一个起始值,称为种子,以生成数字。如果没有给出一个种子,那么它将在每次运行时产生相同的数字流。
要在每次运行程序时获得不同的随机数字流,则必须为随机数生成器提供一个种子以开始。在 C++ 中,这是通过调用 srand 函数完成的。 在 rand 被调用之前,srand 函数要先被调用,并且 srand 在整个程序中仅被调用一次。
# include <iostream>
# include <cstdlib>
using namespace std;
int main(){
unsigned seed;
while (true){
cin >> seed;
srand(seed);
cout << rand() << endl;
cout << rand() << endl;
}
}
从程序的输出可以看出,每次程序使用不同的种子运行时,都会生成不同的随机数字流。然而,如果再次使用 19 或 171 作为种子运行程序,则将获得与第一次完全相同的数字。
实际上,获取种子值的另一个常见做法是调用 time 函数,它是 C++ 标准库的一部分。
time 函数返回从 1970 年 1 月 1 日午夜开始到现在逝去的秒数,因此每次运行程序时,它都将提供不同的种子值。下面程序演示了 time 函数的用法。请注意,在调用它时必须给它传递一个参数 0。同时程序中包含一个新的头文件 ctime,此头文件是使用 time 函数所必需的。
# include <iostream>
# include <cstdlib>
# include <ctime>
using namespace std;
int main(){
// 使用循环模拟拳皇对战
/** HP */
int hp1 = 100;
int hp2 = 100;
int attack1 = 0; // 八神的攻击力
int attack2 = 0; // 草稚京的攻击力
int randNum; //用来存放玩家攻击先后的随机数变量
srand(time(NULL));
// 当双方都生存的时候,继续战斗过程
while (hp1 > 0 && hp2 > 0) {
// 1.模拟玩家出招:可以采用随机数是奇偶决定谁先出招
// 奇数--八神 偶数--草稚京先
randNum = rand();
//cout << RAND_MAX << endl;
if (randNum % 2 == 1){
attack1 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
attack2 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
hp2 -= attack1;
hp1 -= attack2;
}
else{
attack1 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
attack2 = (int)(5 + 10 * rand() / (RAND_MAX + 1.0));
hp1 -= attack2;
hp2 -= attack1;
}
}
//打印对战的最终结果
cout << "八神庵:" << hp1 << endl;
cout << "草稚京:" << hp2 << endl;
cout << rand() << endl;
}