This commit is contained in:
Feast
2026-05-10 09:00:14 +08:00
commit 478b3451a1
30 changed files with 1723 additions and 0 deletions
+121
View File
@@ -0,0 +1,121 @@
# 第 4 课:运气来了(随机数)
**本课目标**:让程序每次运行(或每次「抽一下」)得到 **不一样的整数**,为后面的「抽到普通 / 稀有卡」做准备。学会使用 **`rand`**、**`srand`** 和 **`%` 取余**。
**复习**:第 3 课用 `cin` 读入数据;本课的数据来自 **程序内部的随机**,不靠键盘。
---
## 1. 这一课要搞懂什么
- **`std::rand()`**:返回一个很大的随机整数(每次调用会变)。
- **「种子」`std::srand(...)`**:告诉电脑「从哪一串运气开始乱」。种子一般在 **`main` 里、第一次 `rand` 之前只设一次**。
- **常用种子**:用当前时间 `std::time(nullptr)`,这样每次运行程序,种子不同,随机序列也不同。
- **`%`(取余)**:把很大的数 **缩到你想要的范围**。例如 `% 100` 得到 **099**
需要多两个头文件:
- `#include <cstdlib>` —— `rand``srand`
- `#include <ctime>` —— `time`
---
## 2. 第一个随机数程序
保存为 `lesson4.cpp`(或 `lession4.cpp`,和编译命令一致即可):
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
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` | 099 |
| `std::rand() % 10` | 09 |
| `std::rand() % 6` | 0~5(像六面骰的 0~5 版) |
以后要 **1100** 可以以后再学「加偏移」:`% 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`,看多运行几次是不是都落在 09。
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 <cstdlib>``<ctime>`**:可能报 `rand` / `time` 未声明。
- **`srand` 写了很多次**:一般只在开头写一次;循环里反复 `srand` 可能让随机性变差,本课先别在循环里设种子。
- **想要小数**:本课都是整数随机;小数以后用 `double` 等再扩展。
---
## 10. 下一课预告
第 5 课学 **`if` / `else if` / `else`**:根据 `r` 落在哪个区间,打印「普通 / 稀有 / 超稀有」——抽卡的核心逻辑就来了。
---
*学完请家长在 `学习进度与状态.md` 里更新第 4 课的状态与作业完成情况。*
**下一课文档**`第05课-稀有度与判断.md`