NumPy随机数不固定是因为默认用系统时间初始化状态,必须显式设种子;random.seed()无效因它只影响Python标准库random模块,与NumPy无关;推荐用np.random.default_rng(seed)而非np.random.seed()。

NumPy 的随机数不固定,是因为每次运行都用系统时间等不可控因素初始化了随机状态;必须用 np.random.seed() 或更现代的 np.random.Generator 显式设种子,否则结果必然不同。
为什么 random.seed() 不起作用?
这是最常踩的坑:Python 标准库的 random.seed() 只影响 random 模块,对 numpy.random 完全无效。两者是独立的随机数生成器。
- 调用
random.seed(42)后用random.randint()能复现,但np.random.randint()依然每次不同 - NumPy 从 1.17 开始推荐用
np.random.default_rng(seed),旧版才用np.random.seed() - 即使设了种子,若后续代码中又调用了未受控的随机操作(如某第三方库内部用了
np.random),也会污染状态
正确设置 NumPy 随机种子的两种方式
取决于你用的是旧版 NumPy(
- 旧版(推荐仅用于维护老项目):
np.random.seed(42)—— 全局生效,简单但线程不安全 - 新版(强烈推荐):
rng = np.random.default_rng(42),然后用rng.random()、rng.integers()等方法 —— 实例隔离,可重复、可并行 - 注意:
np.random.seed()和default_rng()互不影响;不能用前者设种后,再指望后者产出相同序列
常见错误场景与验证方法
光设种子不够,还要验证是否真“固定”。尤其在 Jupyter 中,单元格多次运行容易误判。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
- 错误:在不同 cell 中分别调用
np.random.seed(42)和np.random.rand(3)—— 若中间执行过其他含随机操作的代码(包括自动补全、matplotlib 绘图),状态已被改写 - 错误:用
np.random.Generator但没保存实例,每次新建default_rng(42)看似一样,实则每次都是新对象(没问题),但若误写成np.random.default_rng().integers(...)就失去可复现性 - 验证方法:连续两次运行同一段生成代码,输出数组必须逐元素相等;建议用
np.array_equal(a, b)判断,别只看 print
真正麻烦的不是设种子,而是确保整个随机链路——从数据加载、打乱、划分到模型初始化——都使用同一个可控的 Generator 实例。漏掉任意一环,复现就会失败。

















