# 第 4 课:运气来了(随机数) **本课目标**:让程序每次运行(或每次「抽一下」)得到 **不一样的整数**,为后面的「抽到普通 / 稀有卡」做准备。学会使用 **`rand`**、**`srand`** 和 **`%` 取余**。 **复习**:第 3 课用 `cin` 读入数据;本课的数据来自 **程序内部的随机**,不靠键盘。 --- ## 1. 这一课要搞懂什么 - **`std::rand()`**:返回一个很大的随机整数(每次调用会变)。 - **「种子」`std::srand(...)`**:告诉电脑「从哪一串运气开始乱」。种子一般在 **`main` 里、第一次 `rand` 之前只设一次**。 - **常用种子**:用当前时间 `std::time(nullptr)`,这样每次运行程序,种子不同,随机序列也不同。 - **`%`(取余)**:把很大的数 **缩到你想要的范围**。例如 `% 100` 得到 **0~99**。 需要多两个头文件: - `#include ` —— `rand`、`srand` - `#include ` —— `time` --- ## 2. 第一个随机数程序 保存为 `lesson4.cpp`(或 `lession4.cpp`,和编译命令一致即可): ```cpp #include #include #include int main() { std::srand(std::time(nullptr)); int r = std::rand() % 100; std::cout << "随机数:" << r << "\n"; return 0; } ``` 多运行几次 `./程序名`,观察:**数字会变**。 --- ## 3. `srand` 为什么要写?(先有个印象) 如果 **不写** `std::srand(...)`,有些环境下每次运行程序,`rand()` 出来的顺序可能 **一模一样**。加了用时间当种子,更像「每次开游戏运气不同」。 本课记住:**在 `main` 开头写一次 `std::srand(std::time(nullptr));` 就对了。** --- ## 4. `%` 怎么帮你「限定范围」 | 写法 | 结果范围(整数) | |------|------------------| | `std::rand() % 100` | 0~99 | | `std::rand() % 10` | 0~9 | | `std::rand() % 6` | 0~5(像六面骰的 0~5 版) | 以后要 **1~100** 可以以后再学「加偏移」:`% 100` 再加 1 等;本课先掌握 **0 起头** 即可。 --- ## 5. 和抽卡游戏的关系 下一课会把随机数放进 **`if` 判断**:数字落在不同区间 → 普通 / 稀有 / 超稀有。本课只练:**能生成一个 0~99 的 `r` 并打印**。 --- ## 6. 怎么编译和运行 ```bash clang++ -std=c++17 -o lession4 lession4.cpp ./lession4 ``` (若你的源文件叫 `lesson4.cpp`,把命令里的名字一起改掉,保持 **源文件名、` -o` 名字、`./` 名字** 一致。) --- ## 7. 本课课堂小练习 1. 把 `% 100` 改成 `% 10`,看多运行几次是不是都落在 0~9。 2. 连续输出 **3 个** 随机数(调用三次 `std::rand() % 100`,分三行 `cout`),看三次是不是一般互不相同。 示例结构(数字和换行可自己调整): ```cpp std::srand(std::time(nullptr)); int a = std::rand() % 100; int b = std::rand() % 100; int c = std::rand() % 100; std::cout << a << " " << b << " " << c << "\n"; ``` --- ## 8. 本课课后作业(选做) - 注释掉 `std::srand(std::time(nullptr));` 这一行,多运行几次程序,观察随机数是否还容易变化(记下现象即可)。 - 问家长:`nullptr` 是什么可以以后再学,本课先当「固定写法配合 `time` 用」。 --- ## 9. 常见小问题 - **忘了 `#include ` 或 ``**:可能报 `rand` / `time` 未声明。 - **`srand` 写了很多次**:一般只在开头写一次;循环里反复 `srand` 可能让随机性变差,本课先别在循环里设种子。 - **想要小数**:本课都是整数随机;小数以后用 `double` 等再扩展。 --- ## 10. 下一课预告 第 5 课学 **`if` / `else if` / `else`**:根据 `r` 落在哪个区间,打印「普通 / 稀有 / 超稀有」——抽卡的核心逻辑就来了。 --- *学完请家长在 `学习进度与状态.md` 里更新第 4 课的状态与作业完成情况。* **下一课文档**:`第05课-稀有度与判断.md`