randint(a, b) 生成包含两端的整数随机数,如 randint(1, 6) 返回 1~6(含),易与 range 或 randrange 的左闭右开混淆,导致逻辑错误;使用时须确保 a ≤ b。

randint 生成整数随机数,但边界值容易搞反
randint 是最常用的整数随机函数,但它和 range 不同:两个参数都**包含在内**。比如 randint(1, 6) 可能返回 1、2、3、4、5 或 6 —— 不是 1 到 5。新手常误以为它像 random.randrange(1, 6) 那样左闭右开,结果多出一个值或少一个值。
常见错误现象:ValueError 倒不常有,但逻辑错位很隐蔽,比如模拟骰子却出现 0 或 7;或者做索引时越界(如用 randint(0, len(lst)) 而不是 randint(0, len(lst)-1))。
- 用
randint(a, b)时,确保a ,否则直接抛 <code>ValueError - 需要「左闭右开」行为(如取索引),优先用
randrange(a, b)或choice(range(a, b)) - 如果只是想从固定范围选一个整数,且边界明确,
randint最直白;但涉及循环、索引、分片时,建议统一用randrange避免混淆
choice 适合从序列里抽一个元素,但不能传字符串字面量当“单个选项”
choice 的输入必须是**非空序列**(list、tuple、str、bytes 等),但它对 str 的处理常被误解:传入 "abc" 会随机返回 'a'、'b' 或 'c',而不是把整个字符串当一个选项。
典型翻车场景:想从几个字符串中随机选一个,却写成 choice("apple", "banana", "cherry") —— 这会报 TypeError: choice() takes exactly one argument;或者误写成 choice("apple"),结果只在字母间挑。
- 从多个字符串中选一个,得包成列表:
choice(["apple", "banana", "cherry"]) - 如果序列只有一个元素(比如
[42]),choice永远返回它,不会报错,但可能掩盖逻辑漏洞 -
choice对str和bytes是按字符/字节抽,不是按“单词”抽 —— 这是设计如此,不是 bug
randint 和 choice 性能差异小,但 choice 依赖序列长度,randint 不依赖数据
两者底层都调用同一个随机数生成器(_random.Random().random()),所以性能差别几乎可以忽略。真正影响选择的是语义和输入结构。
例如,要从 [10, 20, 30, 40] 里随机取一个数,用 choice([10, 20, 30, 40]) 更自然;但如果只是要 10~40 之间任意整数,randint(10, 40) 不用构造列表,内存更省,也更清晰。
-
choice(seq)时间复杂度是 O(1),但前提是len(seq)是 O(1) 操作(list、str是,而某些自定义迭代器可能不是) -
randint(a, b)完全不检查输入内容,只做算术运算,所以哪怕a和b是超大整数(如10**100),只要不溢出 Python int,它就照算 - 如果序列很大(比如百万级 list),又只需要一个随机元素,
choice仍是首选 —— 它不会遍历,只取索引
别忘了先 import random,且不要重命名模块破坏可读性
几乎所有问题都卡在这一步:NameError: name 'randint' is not defined 或 AttributeError: module 'random' has no attribute 'randint'。根本原因只有两个:没导入,或导入方式不对。
常见错误写法:from random import *(污染命名空间)、import random as r 然后写 r.randint(1,6)(看似省事,但团队协作时别人看不懂 r 是啥)。
- 标准写法就是
import random,然后用random.randint(1, 6)和random.choice([...]) - 如果确定只用这两个函数,可以用
from random import randint, choice,但别加as改名 - 绝对不要在函数里反复
import random—— 模块导入是全局的,重复 import 没副作用但显得慌乱
真正容易被忽略的是:当你在类方法或闭包里多次调用 randint 或 choice,却没意识到它们共享同一个全局随机状态。如果需要隔离随机行为(比如单元测试、多线程),得显式创建 random.Random() 实例,而不是依赖模块级别的函数。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











