np.random.seed() 是重置伪随机数生成器状态而非锁定输出,仅控制序列起点;需分别设置 sklearn、pytorch、tensorflow、pandas 及多线程的随机种子;新版推荐用 np.random.default_rng() 避免全局状态污染。

因为不设种子,每次运行代码产生的随机数序列都不同,模型训练、数据划分、参数初始化的结果就不可比、不可复现。
np.random.seed() 不是“开关”,而是“重置指针”
它不会让后续所有 np.random.rand() 返回同一个数,而是把伪随机数生成器的内部状态重置到种子对应的位置。之后每次调用 np.random.rand()、np.random.randint() 等函数,都会按固定顺序往后取数。
- 调用一次
np.random.seed(42)后,第一次np.random.rand()返回值 A,第二次返回值 B,第三次返回值 C…… - 再调用一次
np.random.seed(42),下一次np.random.rand()又会返回 A(不是重复上一次的 C) - 所以它控制的是“序列起点”,不是“输出锁定”
只设一次 seed() 不能覆盖全部随机操作
很多新手以为在脚本开头写一行 np.random.seed(42) 就万事大吉,但实际中容易漏掉几个关键点:
-
sklearn.train_test_split()默认用系统时间做种子,除非显式传random_state=42 -
torch.manual_seed()和tf.random.set_seed()是各自独立的,NumPy 的 seed 对它们完全无效 - Pandas 的
df.sample()或df.shuffle()必须单独指定random_state参数,不继承 NumPy 的状态 - 多线程/多进程环境下,子线程默认不共享父线程的随机状态,需在每个线程里重新调用
np.random.seed()
新版 NumPy 推荐用 default_rng() 而非 seed()
从 NumPy 1.17 开始,np.random.seed() 被标记为 legacy,官方推荐使用生成器对象:
rng = np.random.default_rng(seed=42) arr = rng.random(5) # 替代 np.random.rand(5) idx = rng.integers(0, 10) # 替代 np.random.randint(0, 10)
好处是:rng 是独立实例,不会污染全局状态;适合并行任务或模块化设计;且更明确地隔离随机性作用域。
但注意:旧代码里大量存在的 np.random.* 函数仍依赖全局状态,混用 default_rng() 和全局函数可能导致行为不一致。
真正影响可复现性的,从来不是“有没有设 seed”,而是“哪些地方用了随机、哪些地方没管住”。一个模型跑出不同结果,90% 的时候不是算法问题,是某处随机源漏设了 random_state 或忘了调 seed()。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











