numpy 1.17+ 不推荐 np.random.seed(),因其仅影响旧 randomstate,而新函数默认使用独立 generator,导致不可复现;应改用 np.random.default_rng(42) 显式创建并统一使用该实例。

为什么 np.random.seed() 不再推荐
NumPy 1.17+ 引入了新的随机数生成器(Generator)和旧的 RandomState 分离,np.random.seed() 只影响全局 RandomState 实例,但很多新函数(如 np.random.normal()、np.random.choice())默认已切换到 Generator 路径——这意味着调用 np.random.seed(42) 后,仍可能得到不可复现的结果。
常见错误现象:np.random.randn(3) 每次运行结果不同,即使前面写了 np.random.seed(42)。
- 根本原因是:新 API 默认使用独立的
Generator实例,不共享全局 seed 状态 -
np.random.seed()仅对遗留接口(如np.random.random_sample())有效 - 跨线程或子进程时,该方式完全失效(无状态传递)
正确做法:用 np.random.default_rng() + 显式种子
必须放弃“设一次全局种子”的幻想,改为显式创建带种子的 Generator 实例,并在所有随机操作中使用它。这是 NumPy 官方当前唯一保证可复现的方式。
实操建议:
- 统一用
rng = np.random.default_rng(42)创建实例,不要用np.random.Generator(np.random.PCG64(42))这类冗长写法 - 所有随机函数调用都走
rng.xxx(),例如:rng.normal(0, 1, size=5)、rng.choice(['a','b'], size=3) - 避免混用:不要在同一个项目里一部分用
rng.integers(),另一部分又用np.random.randint() - 如果必须调用依赖全局
RandomState的第三方库(如旧版 SciPy),需额外调用np.random.seed(42)配合,但优先升级依赖
如何处理多模块/多文件项目的种子一致性
不能靠“每个文件开头写一遍 np.random.seed(42)”,因为模块导入顺序、执行时机不可控,且无法覆盖 Generator 行为。
推荐方案是:在主入口(如 train.py)中创建并注入 rng,通过参数或全局配置传递给各模块。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 简单场景:定义一个模块级变量
GLOBAL_RNG = np.random.default_rng(42),在公共 utils 文件中初始化,其他文件from utils import GLOBAL_RNG - 复杂场景(如训练循环、数据加载器):把
rng作为参数传入函数,例如def load_batch(data, rng, batch_size): - 切忌在函数内部重复创建
default_rng()—— 没传 seed 就等于没设种子;传了 seed 则每次新建实例,打乱序列逻辑
示例片段:
import numpy as np <h1>✅ 正确:统一源头</h1><p>GLOBAL_RNG = np.random.default_rng(12345)</p><p>def sample_with_noise(x): return x + GLOBAL_RNG.normal(0, 0.1, size=x.shape)</p><h1>❌ 错误:每次调用都新建无 seed 的 Generator</h1><p>def bad_sample(x): rng = np.random.default_rng() # 没 seed → 不可复现 return x + rng.normal(0, 0.1, size=x.shape)</p>
PyTorch/TensorFlow 用户特别注意:NumPy 种子不自动同步
PyTorch 和 TensorFlow 各自维护独立的随机状态,设置 np.random.default_rng(42) 对 torch.randn() 或 tf.random.normal() 完全无效。
若实验混合使用多个框架,必须分别设置:
- NumPy:
np.random.default_rng(42) - PyTorch:
torch.manual_seed(42)(CPU) +torch.cuda.manual_seed_all(42)(GPU) - TensorFlow:
tf.random.set_seed(42)(TF 2.x) - Python 内置
random:random.seed(42)(影响random.shuffle()等)
最容易被忽略的是:数据预处理中混用 random.shuffle() 和 np.random.permutation(),二者种子不互通,必须分别设。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










