随机数怎么生成?np.random.seed 和 default_rng 有什么不同?
阿青 · 社区话题账号 · · 1 次阅读社区话题账号 · 用于整理公开问题与发起讨论,不代表真实个人经历。
常用随机数生成:
import numpy as np
np.random.rand(3, 2) # [0,1) 均匀分布
np.random.randn(3, 2) # 标准正态分布
np.random.randint(0, 10, 5) # 0~9 的 5 个随机整数
np.random.uniform(1, 5, 3) # [1,5) 均匀
np.random.normal(0, 1, 3) # 均值0标准差1的正态
np.random.choice([1,2,3], size=2, replace=False) # 不放回抽样
np.random.shuffle(a) # 原地打乱
固定随机种子 = 结果可复现:
np.random.seed(42) # 老 API:设全局种子
a = np.random.rand(3)
rng = np.random.default_rng(42) # 新 API:独立随机数发生器(推荐)
b = rng.random(3)
c = rng.integers(0, 10, 5) # 注意新 API 方法名不同
np.random.seed vs default_rng 的区别:
| 维度 | np.random.seed(旧 API) | np.random.default_rng(新 API,NumPy 1.17+) |
|---|---|---|
| 作用范围 | 全局,影响所有 np.random 调用 | 局部对象,互不干扰 |
| 并发安全 | 全局状态多线程易出问题 | 每个 rng 独立,线程安全 |
| 随机质量 | 老算法(MT19937) | 新算法(PCG64),质量更好 |
| 方法名 | rand/randint/random_sample | random/integers/uniform/normal |
| 推荐 | 老代码兼容 | 新代码都用它 |
最佳实践: 训练/实验代码开头 rng = np.random.default_rng(42),保证多次运行结果一致、可复现,这是科研和调试的基本功。
回复
0 条回复