3.9 KiB
3.9 KiB
第 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,和编译命令一致即可):
#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. 怎么编译和运行
clang++ -std=c++17 -o lession4 lession4.cpp
./lession4
(若你的源文件叫 lesson4.cpp,把命令里的名字一起改掉,保持 源文件名、 -o 名字、./ 名字 一致。)
7. 本课课堂小练习
- 把
% 100改成% 10,看多运行几次是不是都落在 0~9。 - 连续输出 3 个 随机数(调用三次
std::rand() % 100,分三行cout),看三次是不是一般互不相同。
示例结构(数字和换行可自己调整):
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