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; }
调试:
- 分析错误
- 设置断点
- 启动调试
- 单步运行
- 观察变量
- 发现问题
- 修正代码重新运行
do-while循环:
特点:先执行,在判断
- 先执行一遍循环操作
- 符合条件,循环继续
- 否则循环退出
while循环和do-while循环的区别
- 执行顺序不同
- 初始情况不满足循环条件时:
- while循环一次都不会执行
- do-while循环不管任何情况都至少执行一次