np.random.randint生成左闭右开区间的随机整数,如randint(1,6)得1~5;需含上界应写randint(1,7);新api推荐default_rng().integers并设endpoint=true实现左闭右闭。

用 np.random.randint 生成指定范围的随机整数
np.random.randint 是最直接的选择,但要注意它的区间是「左闭右开」:即包含下界,不包含上界。比如 np.random.randint(1, 6) 生成的是 1、2、3、4、5,**永远不会出现 6**。
常见错误是误以为参数范围和数学区间一致,结果少了一个数。如果需要 [1, 6](含 6),得写成 np.random.randint(1, 7)。
实操建议:
- 生成单个数:
np.random.randint(low=0, high=10)(等价于np.random.randint(0, 10)) - 生成数组:
np.random.randint(0, 10, size=(3, 4))→ 3 行 4 列,每个值 ∈ [0, 10) - 若需指定 dtype(如 int64 或 uint8),加
dtype=np.int64参数,尤其在内存敏感场景有用
为什么不用 np.random.choice?
np.random.choice 适合从已有集合中抽样,比如从 [2, 4, 6, 8] 里随机选几个;但它不适合「生成连续范围内任意整数」这种需求——你需要先构造一个完整数组(如 np.arange(0, 1000000)),再抽样,既浪费内存又慢。
除非你明确需要「无放回抽样」或「带权重抽样」,否则别用它替代 randint。例如:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 要从 0~99 中不重复选 5 个数 →
np.random.choice(100, size=5, replace=False) - 要按概率抽样 → 必须用
choice的p参数,randint不支持
注意 NumPy 版本差异:新旧随机数生成器
NumPy 1.17+ 推荐使用新 API:np.random.Generator,更安全、可复现性更强。老代码里的 np.random.randint(无显式 Generator)属于 legacy 接口,仍可用,但不推荐用于新项目。
正确做法是先创建 Generator 实例:
rng = np.random.default_rng(seed=42) rng.integers(1, 10, size=5, endpoint=True)
注意:rng.integers 默认是左闭右闭([low, high]),且有 endpoint 参数控制是否包含上界 —— 这比旧版 randint 更符合直觉。但如果你依赖旧行为,别混用。
边界值与数据类型溢出风险
当范围很大(如 low=-2**63, high=2**63)时,randint 可能因 dtype 默认为 int64 而报错或静默截断。显式指定 dtype 更稳妥:
np.random.randint(-100, 100, dtype=np.int32)- 若需无符号整数:
np.random.randint(0, 256, dtype=np.uint8) - 越界时不会自动提升类型,错误可能只在运行时暴露(如生成负数却存进
uint8)
真正容易被忽略的是:不同函数对「相同 seed」的复现性不互通。用 default_rng(42) 生成的序列,和用旧 np.random.seed(42); np.random.randint(...) 生成的完全不同 —— 移植代码时务必验证随机序列是否一致。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










