做小游戏、设计抽奖软件、甚至生成手机验证码,都离不开一个核心功能——随机数!
在 Python 里,专门处理随机数的就是自带的 random 模块。很多家长和孩子刚接触时,常被 randint、randrange、choice、sample 这些名字长得很像的函数搞混。
今天咱们就用最通俗的大白话,把 random 库最常用的 8 个神仙函数 一网打尽,建议收藏备用!
❓ 揭秘:电脑生成的随机数,其实是“假的”?
在动手写代码前,先告诉娃一个冷知识:计算机里产生的“随机数”其实叫伪随机数。
因为真正意义上的随机是无法被预测的,而电脑是依靠一套严格的数学公式算出来的。只要给电脑输入的“起始起点”(随机种子)一样,它算出来的“随机数”就会完全一模一样! 默认情况下,电脑会用“当前系统时间”作为种子,所以我们感觉每次都是随机的。
🔑 1. 操控随机命运的钥匙:random.seed()
🔢 2. 抓取随机整数:randint() vs randrange()
这两个函数都是用来生成随机整数的,但有一个非常关键的区别!
① randint(start, stop):包含头也包含尾(双闭区间)
最符合人类直觉!比如 randint(1, 6),就像掷骰子,1 和 6 都有可能投出来。
② randrange(start, stop, step):包含头不包含尾,还能加步长
它的规则和 Python 的 range() 一模一样,包头不包尾,而且还能设置跳跃间隔(步长)。
📌 辨析小卡片
| 函数名 | 是否包含末尾数字 | 是否支持步长 |
randint(a, b) | 包含b | ❌ 不支持(默认一步1个) |
randrange(a, b, step) | 不包含b | ✅ 支持(如只抽取偶数/奇数) |
🎁 3. 抽奖与选词:choice()、choices() 与 sample()
如果要从列表、字符串或者元组等数据里“抽奖”,用这三个函数就对了。
① choice(seq):单抽(只选1个)
从指定的序列里随机拎一个元素出来。
names = ['小明', '小红', '小刚']print(random.choice(names)) # 随机返回其中某一个人名
② choices(seq, weights, k):连抽(有放回抽样 + 氪金概率)
③ sample(seq, k):不重复抽样(无放回抽样)
📌 抽奖三兄弟对比表
| 函数名 | 抽几个? | 抽取结果会重复吗? | 适合场景 |
choice | 只抽 1 个 | / | 决定今天吃什么、选谁回答问题 |
choices | 自定义 k 个 | 会(有放回,可设概率) | 游戏卡池抽卡、模拟掷骰子多次 |
sample | 自定义 k 个 | 不会(无放回,不重复) | 抽奖一二三等奖、发牌 |
🃏 4. 自动洗牌:shuffle()
pokers = ['红桃A', '黑桃K', '方块5', '梅花Q']random.shuffle(pokers)print(pokers) # 原列表的顺序已经被随机打乱了!
📐 5. 生成小数与概率:random() vs uniform()
如果需要用到小数(比如命中率、概率计算、物理碰撞模拟),就需要用到它们。
① random.random():生成 0 到 1 之间的小数
无需参数,专门返回 [0.0, 1.0) 之间的随机浮点数。
print(random.random()) # 例如:0.654321
② uniform(a, b):指定范围的小数
可以自由设置上限和下限(包含 a 和 b),在这个范围里随机找一个浮点数。
📝 终极复习小结
学完这 8 个函数,孩子写小程序、做微型游戏(如贪吃蛇位置生成、猜数字游戏、卡牌对战)就完全够用了!
控制种子:seed() —— 锁定随机结果。
选整数:randint()(包头包尾)/ randrange()(包头不包尾)。
选元素:choice()(抽1个)/ choices()(重复抽+设概率)/ sample()(不重复抽)。
打乱顺序:shuffle() —— 列表洗牌。
生成小数:random()(0到1)/ uniform()(指定范围)。