122 lines
3.9 KiB
Markdown
122 lines
3.9 KiB
Markdown
# 第 4 课:运气来了(随机数)
|
||
|
||
**本课目标**:让程序每次运行(或每次「抽一下」)得到 **不一样的整数**,为后面的「抽到普通 / 稀有卡」做准备。学会使用 **`rand`**、**`srand`** 和 **`%` 取余**。
|
||
|
||
**复习**:第 3 课用 `cin` 读入数据;本课的数据来自 **程序内部的随机**,不靠键盘。
|
||
|
||
---
|
||
|
||
## 1. 这一课要搞懂什么
|
||
|
||
- **`std::rand()`**:返回一个很大的随机整数(每次调用会变)。
|
||
- **「种子」`std::srand(...)`**:告诉电脑「从哪一串运气开始乱」。种子一般在 **`main` 里、第一次 `rand` 之前只设一次**。
|
||
- **常用种子**:用当前时间 `std::time(nullptr)`,这样每次运行程序,种子不同,随机序列也不同。
|
||
- **`%`(取余)**:把很大的数 **缩到你想要的范围**。例如 `% 100` 得到 **0~99**。
|
||
|
||
需要多两个头文件:
|
||
|
||
- `#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` | 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 <cstdlib>` 或 `<ctime>`**:可能报 `rand` / `time` 未声明。
|
||
- **`srand` 写了很多次**:一般只在开头写一次;循环里反复 `srand` 可能让随机性变差,本课先别在循环里设种子。
|
||
- **想要小数**:本课都是整数随机;小数以后用 `double` 等再扩展。
|
||
|
||
---
|
||
|
||
## 10. 下一课预告
|
||
|
||
第 5 课学 **`if` / `else if` / `else`**:根据 `r` 落在哪个区间,打印「普通 / 稀有 / 超稀有」——抽卡的核心逻辑就来了。
|
||
|
||
---
|
||
|
||
*学完请家长在 `学习进度与状态.md` 里更新第 4 课的状态与作业完成情况。*
|
||
|
||
**下一课文档**:`第05课-稀有度与判断.md`
|