Files
chouka/old/第04课-运气来了.md
T
2026-05-16 11:09:02 +08:00

122 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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`