必须用np.random.default_rng(seed)创建Generator实例,不可直接调用旧接口;传固定整数种子(如42)确保可复现,传None则每次不同;integers()替代randint(),normal()或standard_normal()替代randn(),避免混用新旧接口。

用 default_rng() 创建 Generator 实例
必须先创建 Generator 对象,不能直接调用 np.random.random() 这类旧接口——后者仍能运行,但属于遗留模式,状态不可控、不推荐用于新项目。
最简方式是:
import numpy as np rng = np.random.default_rng(seed=42)
seed 参数可选,但强烈建议显式传入整数(如 42)或 None;传 None 时会基于系统熵自动初始化,结果不可复现。
- 不传
seed或传None:每次运行序列都不同,适合生产环境的非确定性场景 - 传固定整数(如
42):相同 NumPy 版本下,rng.random(3)每次输出完全一致 - 避免用
np.random.seed(42)全局设种:它只影响旧RandomState行为,对Generator无效
integers() 替代 randint() 生成随机整数
旧版 np.random.randint(low, high) 默认包含 low、不包含 high,但语义模糊;新版 integers() 明确支持 endpoint 控制上界是否闭合。
立即学习“Python免费学习笔记(深入)”;
常用写法:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
rng.integers(0, 10, size=5) # [0, 10) → 0~9,等价于旧版 randint(0, 10) rng.integers(1, 7, size=3, endpoint=True) # [1, 7] → 1~7,模拟掷骰子
-
endpoint=False(默认):区间左闭右开,与旧版行为一致 -
endpoint=True:左右都闭,更符合直觉,尤其用于离散枚举场景 -
dtype可显式指定,如dtype=np.int32,避免在大数组中浪费内存
生成正态分布要用 normal() 或 standard_normal()
新版 Generator 不再支持 randn() ——该函数已从 Generator 实例方法中移除,仅保留在全局 np.random 命名空间中(为兼容旧代码)。
正确做法是:
rng.standard_normal(5) # 标准正态:μ=0, σ=1 rng.normal(loc=100, scale=15, size=3) # 自定义均值和标准差
-
standard_normal()是快捷方式,等价于normal(loc=0, scale=1, ...) -
scale参数对应标准差(不是方差),别和 SciPy 的norm.rvs()混淆 - 若需大量采样,直接传
size比循环调用快得多;size=None时返回标量
为什么不能混用 Generator 和全局 np.random 函数
全局 np.random.rand()、np.random.randn() 等函数底层仍走旧 RandomState 路径,它们有自己的内部状态,与你创建的 rng 完全无关。
这意味着:
- 调用
rng.integers(1, 6)和np.random.randint(1, 6)即使 seed 相同,结果也不同 - 两个
Generator实例(哪怕 seed 相同)彼此独立;但全局函数之间共享状态,易被意外污染 - 多线程/多进程时,
Generator实例可安全传递,而全局np.random函数线程不安全
真正需要跨上下文复现时,唯一可靠方式是把 Generator 实例本身作为参数传入函数,而不是依赖全局状态。

















