第 10 课 · 随机数

骰子模拟器

给程序请来 random 这位「运气大师」:掷骰子、抽签、随机出拳——第 5 课的石头剪刀布终于能真正随机对战了!

120 分钟完整闭环 4 个知识点 5 段示范代码 难度 ★★
🏠 学期课件主页 ← 上一课:逻辑运算下一课:字符串魔法 →
01

本课导览

先看这节课教什么、怎么分配 120 分钟,老师心里有底,课堂节奏就不乱。

第10课随机数
🎯 趣味项目:骰子模拟器
模块 importrandom.randintrandom.choice列表
🎯教学目标(学完这节课,学生能…)
  • 理解「模块」的概念,知道 Python 有大量别人写好的工具包,用 import 就能借来用;
  • 掌握 random.randint(a, b) 的用法:随机生成 a 到 b 之间的整数(含两端);
  • 掌握 random.choice(列表) 的用法:从列表里随机选一个元素;
  • 认识列表 list:用方括号 [] 装一串数据,元素用逗号隔开;
  • 能编写骰子模拟器,并把第 5 课的石头剪刀布升级为电脑随机出拳的对战版。
🔑 教学重点
  • import random 导入模块,然后 random.工具名() 使用
  • randint(1,6) 掷骰子;choice([...]) 随机抽一个
🧗 教学难点 / 易卡点
  • 忘记写 import random 就调用 random 报错
  • randint 的两个端点记成「顾头不顾尾」(其实是含两端)
  • 分不清列表的 [ ] 与字符串的引号
🧰课前准备(老师 / 学生)
  • 老师:准备一副骰子或转盘教具;提前把「升级版石头剪刀布」代码测试几局,确认胜负统计正常。
  • 学生:打开作品文件夹;今天作品保存为「第10课_骰子模拟器.py」(石头剪刀布升级版另存一个)。
  • 课堂小活动:先让学生真实掷 10 次骰子记录点数,再让电脑掷 10 次对比——感受「随机」。
⏱️120 分钟教学流程(建议时间轴,可按班级情况微调)
时间环节做什么 / 师生互动要点
0–5候课 · 设备检查开机 → 打开编辑器 → 确认作品文件夹就位。
5–12上节回顾 · 快问快答and/or/not 各是什么意思?闰年公式还记得吗?1900 和 2000 谁是闰年?
12–20情景导入掷骰子决定谁先发球。问:电脑能掷骰子吗?它怎么做出「每次都不一样」的数?引出 random。
20–35知识讲解模块 = 工具箱,import = 拿工具 → random.randint → 列表 [ ] → random.choice,逐个配例子。
35–55示范代码 + 上机(示例1~3)掷 10 次骰子(for)→ 列表与 choice 抽奖 → 随机出拳的迷你石头剪刀布。
55–75主项目:骰子模拟器按回车掷两个骰子 → 判断「7/11 幸运」和「豹子」→ 输入 q 退出(while True + break)。
75–90主项目 2:升级版石头剪刀布把第 5 课的 computer = 1 改成 random.choice → 加入胜负统计和输入 q 退出。
90–100课堂练习 A/B练习 1 掷 10 次找豹子;练习 2 随机生成 10 个 1~100 的数;投屏找茬。
100–108挑战练习 C抛硬币猜正反 10 次计分;学有余力的同学做随机点名器。
108–115总结 · 保存作品齐读口诀;保存两个作品;预告第 11 课:字符串魔法——切开、翻转、变身文字。
115–120布置作业 · 预告布置必做/选做/思考;预告密码生成器——随机和字符串的合体!

时间轴把 2 小时切成 8 段:复习→导入→讲解→示范→上机→练习→检测→小结,每段都有明确产出。

02

情景导入 · 复习热身

先用 5 分钟把上节课的记忆叫醒,再用故事和类比把新知识挂到孩子已有的经验上。

🔁上节回顾 · 快问快答(建议 5 分钟)

问 1:and / or / not 三个词的记忆口诀是什么?
→ and 两个都要、or 一个就够、not 专说反话。 闰年公式就是它们合伙写的。

问 2:闰年判断公式写一遍?
→ (year%4==0 and year%100!=0) or (year%400==0)。 四年一闰,百年不闰,四百年再闰。

问 3:1900 年和 2000 年谁是闰年?
→ 2000 是,1900 不是(能被 100 整除但不能被 400 整除)。 世纪年要看能不能被 400 整除。

📖情景故事 · 今天学什么

班级足球赛要开始了,两队争发球权。体育老师掏出一枚硬币:正面你们先开球,反面他们先开球!

硬币抛向空中,小刚盯着它转啊转——落下来是哪面?抛之前谁也不知道。这就是随机。

小刚问:电脑能抛硬币吗?老师笑了:能!电脑里住着一位「运气大师」叫 random,你喊一声 import random,它就能帮你掷骰子、抛硬币、抽签。

小刚眼睛亮了:那第 5 课的石头剪刀布,电脑只会傻傻出石头,太无聊了!我要请 random 帮电脑随机出拳!

今天,就把这位「运气大师」请进你的程序——掷骰子、抽签、随机对战,让你的游戏真正活起来!

💡生活类比:把新知识挂在旧经验上
🧰

模块 = 工具箱

Python 有很多别人写好的工具箱(模块),要用哪个就 import 哪个,像借工具要喊一声「借我」。

import 导入
🎲

randint = 掷骰子

random.randint(1, 6) 像掷一颗六面骰子,返回 1~6 中随便一个整数(含 1 和 6)。

随机整数
🃏

choice = 抽牌

random.choice(["石头","剪刀","布"]) 像闭眼抽一张牌,从列表里随机挑一个。

随机选一个
📦

列表 = 一排小抽屉

[ ] 里用逗号隔开装一串东西,像抽屉柜,choice 就是闭眼拉开一个抽屉。

list 容器
🗝️本课核心口诀(板书 / 齐读)
核 心 口 诀import 先把工具借,random 大师管运气;
randint 掷骰子,choice 闭眼抽一张!
03

知识讲解

分小块讲透语法点,每一块都配生活类比 + 要点小结,讲完立刻口头小试。

🧰模块——别人写好的工具包

Python 里有很多「模块」(module),是别人提前写好、打包好的工具。要用的时候先 import 导入,就能调用里面的工具。

就像你要用画笔,得先从工具箱里拿出来。import random 就是告诉 Python:我要用 random 这个工具箱。

写法:import 模块名 放在程序最开头;用的时候写 模块名.工具名(),比如 random.randint(1, 6)。

Python 还有 math(数学)、time(时间)等很多模块,以后会一个个认识。今天的主角是 random——随机数模块。

import 模块名 导入用:模块名.工具名()import 要写在程序开头
💡 漏写 import random 就直接用 random.randint,会报 NameError——工具没拿出来就使唤它,它当然不认账。
🎲random.randint(a, b)——随机整数

random.randint(a, b) 会随机返回一个 a 到 b 之间的整数,两端都算(含 a 和 b)。

random.randint(1, 6) 就像掷一颗骰子:可能 1、2、3、4、5、6,每次运行都不一样。

注意:和 range 的「顾头不顾尾」不同,randint 两端都含——randint(1, 6) 真的可能出 6。

想模拟掷两个骰子?写两遍:dice1 = random.randint(1, 6),dice2 = random.randint(1, 6),再加起来。

randint(a, b) 返回 a~b 整数两端都包含多调用几次 = 掷好几次
💡 连续运行两次结果可能一样(比如两次都是 6),这不奇怪——随机不等于「每次必须不同」。
🃏列表 [ ] 和 random.choice()——随机选一个

想从几个选项里随机挑一个?先把选项装进列表,再用 random.choice(列表) 随机选。

列表用方括号 [ ] 表示,里面的元素用逗号 , 隔开。例如:choices = ["石头", "剪刀", "布"]。

random.choice(choices) 会随机返回列表里的一个元素——像闭着眼从一排抽屉里抽一个。

除了中文文字,列表里也可以装数字:[1, 2, 3, 4, 5, 6],choice 就能随机抽一个数。

列表:[元素1, 元素2, …]元素用逗号隔开choice(列表) 随机返回一个
💡 列表是 Python 的「万能口袋」,第 11 课之后我们会越来越常用它。
04

示范代码 · 动手做

老师先带读代码、讲注释,再让学生亲手敲一遍——敲错正好学习调试。

Python示例 1 · 示例 1:掷 10 次骰子
# 第10课:随机掷骰子10次
import random   # 请出"运气大师"

for i in range(10):
    dice = random.randint(1, 6)   # 掷一次骰子
    print("第" + str(i + 1) + "次:" + str(dice))
运 行 结 果
第1次:4
第2次:2
第3次:6
第4次:1
第5次:3
第6次:5
第7次:3
第8次:6
第9次:2
第10次:4
✍ 多运行几次,看看每次的输出一样吗?有没有出现过 7?(randint(1,6) 不可能出 7 哦)

🤔 想一想:randint(1, 6) 会出 0 吗?会出 6 吗?它和 range(1,6) 的「顾头不顾尾」有什么不同?

Python示例 2 · 示例 2:列表 + choice——抽签决定谁值日
# 用 random.choice 从列表里随机抽一个人
import random
students = ["小刚", "小美", "乐乐", "朵朵", "阿明"]

name = random.choice(students)
print("今天轮到 " + name + " 值日!")
运 行 结 果
今天轮到 朵朵 值日!
✍ 把列表改成你们小组同学的名字,运行几次看看每次抽到谁。把学生名单换成 [1,2,3,4,5] 试试数字版。

🤔 想一想:random.choice 会返回列表里没有的名字吗?列表里的顺序会影响随机结果吗?

Python示例 3 · 示例 3:迷你石头剪刀布——电脑随机出拳
# 先用 choice 让电脑随机出拳(完整版在后面)
import random
choices = ["石头", "剪刀", "布"]

computer = random.choice(choices)   # 电脑随机出拳
player = input("你出什么(石头/剪刀/布):")

print("你出了:" + player)
print("电脑出了:" + computer)

if player == computer:
    print("平局!")
elif (player == "石头" and computer == "剪刀") or \
     (player == "剪刀" and computer == "布") or \
     (player == "布" and computer == "石头"):
    print("你赢了!")
else:
    print("电脑赢了!")
运 行 结 果
你出什么(石头/剪刀/布):石头
你出了:石头
电脑出了:剪刀
你赢了!
✍ 多玩几局,确认电脑真的会出三种拳(多玩几局三种都会出现)。这就是第 5 课「预告」的实现!

🤔 想一想:和电脑玩 10 局,你赢了几局?猜一猜:玩得越多,胜负比例会接近什么?(各一半)

Python示例 4 · 主项目 1:骰子模拟器
# 第10课主项目:骰子模拟器
# 按回车掷骰子,输入q退出
import random

print("=== 骰子模拟器 ===")
print("按回车掷骰子,输入q退出")

while True:
    cmd = input("按回车掷骰子:")
    if cmd == "q":        # 输入q退出
        break
    dice1 = random.randint(1, 6)   # 掷第一个骰子
    dice2 = random.randint(1, 6)   # 掷第二个骰子
    total = dice1 + dice2
    print("骰子1:" + str(dice1) + "  骰子2:" + str(dice2))
    print("点数和:" + str(total))
    if total == 7 or total == 11:
        print("幸运数字!")
    elif dice1 == dice2:
        print("豹子!两个一样!")
运 行 结 果
=== 骰子模拟器 ===
按回车掷骰子,输入q退出
按回车掷骰子:
骰子1:3  骰子2:5
点数和:8
按回车掷骰子:q
✍ 完整敲一遍,连掷 10 次,数一数出现几次「豹子」。把判断顺序想想:为什么先判 7/11 再判豹子?

🤔 想一想:输入 q 后程序怎么退出的?如果用户输入别的字母(比如 a),会发生什么?

Python示例 5 · 主项目 2:升级版石头剪刀布(带战绩)
# 第10课升级项目:石头剪刀布 v2
# 电脑随机出拳 + 胜负统计 + 输入q退出
import random

choices = ["石头", "剪刀", "布"]
win_count = 0     # 赢的次数
lose_count = 0    # 输的次数

while True:
    player = input("请出拳(石头/剪刀/布),输入q退出:")
    if player == "q":
        break
    if player not in choices:   # 输入了别的文字
        print("输入错误,请重新输入!")
        continue                # 回到循环开头,不计数
    computer = random.choice(choices)
    print("你出了:" + player + ",电脑出了:" + computer)

    if player == computer:
        print("平局!")
    elif (player == "石头" and computer == "剪刀") or \
         (player == "剪刀" and computer == "布") or \
         (player == "布" and computer == "石头"):
        print("你赢了!")
        win_count = win_count + 1
    else:
        print("电脑赢了!")
        lose_count = lose_count + 1

print("战绩:赢" + str(win_count) + "次,输" + str(lose_count) + "次")
运 行 结 果
请出拳(石头/剪刀/布),输入q退出:石头
你出了:石头,电脑出了:布
电脑赢了!
请出拳(石头/剪刀/布),输入q退出:q
战绩:赢0次,输1次
✍ 完整敲一遍。重点理解 continue:输入错字时它让程序「跳过下面、回到 while 开头」继续。玩 5 局看战绩统计对不对。

🤔 想一想:continue 和 break 有什么区别?(break 跳出循环,continue 只是跳过本轮回开头。)玩家输入 q 那局会被计入战绩吗?

05

易错提醒

把最容易翻车的写法先亮出来,见一次、错一次、就会了。

易错点 1

忘记 import random 就用 random

✗ 错误写法
print(random.randint(1, 6))
✓ 正确写法
import random
print(random.randint(1, 6))
为什么:random 是模块,必须先 import 才能用。import 要写在程序最前面,工具要先拿出来才能使唤。
易错点 2

把 randint 当 range,以为「顾头不顾尾」

✗ 错误写法
random.randint(1, 6)  # 以为只能出1~5
✓ 正确写法
random.randint(1, 6)  # 出1~6,含6
为什么:randint 两端都包含:randint(1, 6) 真的能掷出 6。和 range(1,6) 不一样,别记混。
易错点 3

列表元素忘加引号 / 逗号用错

✗ 错误写法
choices = [石头, 剪刀, 布]
✓ 正确写法
choices = ["石头", "剪刀", "布"]
为什么:列表里的文字是字符串,必须加引号;元素之间用英文逗号隔开。不加引号,电脑会把石头当成名字去找,然后报错。
06

课堂练习(分层)

基础题人人过关,进阶题鼓励尝试,挑战题给学有余力的孩子。参考答案给老师做巡视对照。

A组 · 基础(人人必做)课堂完成,老师巡回指导
  1. 运行骰子模拟器,连掷 10 次,记录有没有出现「豹子」和「幸运数字 7/11」。 (提示:豹子 = 两个骰子点数一样。)
  2. 写代码随机生成 10 个 1 到 100 之间的数并打印(for 循环 + randint)。 (提示:range(10) 循环 10 次。)
B组 · 进阶(鼓励尝试)课堂完成,老师巡回指导
  1. 用 random.choice 写「值日生抽签器」:5 个同学名字,每次随机点一个。 (提示:名字装进列表,choice 抽一个。)
  2. 写「随机加法练习」:电脑随机出 5 道 20 以内加法题,你答对记 1 分,最后输出总分。 (提示:a = randint(1,10),b = randint(1,10),答案对就对。)
C组 · 挑战(学有余力)课堂完成,老师巡回指导
  1. 写「抛硬币猜正反」:电脑随机出正面/反面,用户猜 10 次,最后统计猜对几次。 (提示:choices=["正","反"],choice 决定结果;猜对用 if 判断。)
  2. 给骰子模拟器加统计:掷满 20 次自动结束,统计每个点数出现的次数(用 if-elif 计数)。 (提示:准备 c1~c6 六个计数器,用 if 判断点数哪个加 1。)
07

闯关小测

收尾前 10 分钟,用口答 / 举手抢答把今天的关键点过一遍。

闯关 1先举手回答,再对答案

要用 random 模块,程序第一行该写什么?

答案:import random。

💡 先借工具(import),才能用工具(random.xxx)。

闯关 2先举手回答,再对答案

random.randint(1, 6) 可能返回哪些数?

答案:1、2、3、4、5、6(含两端)。

💡 randint 不是「顾头不顾尾」,6 也出得来。

闯关 3先举手回答,再对答案

random.choice(["石头","剪刀","布"]) 是干什么的?

答案:从列表里随机选一个返回。

💡 像闭眼抽一张牌。

闯关 4先举手回答,再对答案

列表用什么符号?元素之间用什么隔开?

答案:方括号 [ ];英文逗号隔开。

💡 列表是装一串东西的容器。

闯关 5先举手回答,再对答案

continue 和 break 有什么区别?

答案:break 跳出整个循环;continue 跳过本轮,回到循环开头继续。

💡 一个「彻底走人」,一个「这轮不玩了下轮再说」。

08

小结 · 作业与预告

用一句话带走今天的内容;作业分层布置,作品记得保存进成长档案。

🖍️本课小结(一句话 + 板书核心词)
一句话带走给程序请来 random 这位「运气大师」:掷骰子、抽签、随机出拳——第 5 课的石头剪刀布终于能真正随机对战了!
import random模块 = 工具箱randint(a,b) 含两端列表 ["石头","剪刀","布"]choice 随机选continue 跳过本轮战绩统计
必做 · 人人过关
  1. 必做题:写「随机点名器」——把 5 个同学的名字放进列表,运行一次随机点一个回答问题,点过的还能再被点到(先不要求去重)。
  2. 把骰子模拟器保存为「第10课_骰子模拟器.py」、石头剪刀布 v2 保存为「第10课_石头剪刀布v2.py」(老师检查)。
选做 · 鼓励挑战
  1. 选做题:模拟掷两个骰子 1000 次(for 循环),统计点数和为 7 的次数——看看 7 是不是最容易出现。
  2. 选做题:写「抽奖转盘」——奖项列表 ["一等奖", "二等奖", "三等奖", "谢谢参与"],choice 抽 10 次,统计各奖项次数。
思考 · 烧脑一下
  1. 思考题:random.randint(1, 6) 真的「完全随机」吗?连续运行两次结果一定不一样吗?试 20 次,数数有没有重复。
  2. 想一想:电脑没有手,它怎么「随机」出数的?查一查「伪随机数」是什么意思。
👉 下节课预告:下一课《字符串魔法》:认识字符串的索引、切片和变身方法——upper、lower、replace,最后用随机+字符串造一个密码生成器!