🧩 1. numpy.random.default_rng() 的参数
官方推荐:
rng = np.random.default_rng(seed)
✔ 参数说明:
seed(可选)
- 可以是:
int(常用)None(默认)np.random.SeedSequence- python 的 bytes-like 对象
✔ 作用:
- 指定生成器的初始状态,使随机数 可复现(deterministic)
- 如果
seed=None(默认):
→ NumPy 使用系统熵(/dev/urandom)自动生成随机种子
→ 随机数 不可复现
示例:
rng1 = np.random.default_rng(42) rng2 = np.random.default_rng(42) print(rng1.random()) # 两者相同 print(rng2.random())
🧩 2. 为什么叫 default_rng()?
因为它返回 推荐的默认随机生成器:
- 不是旧版
RandomState(已不推荐)
- 而是新式
Generator(PCG64)
PCG64 比 Mersenne Twister 更快、更安全、质量更高。
🧩 3. rng 是什么?
rng 是一个实例:rng = np.random.Generator(np.random.PCG64(seed))
Generator = 随机数生成接口(你用的所有 random 方法)
PCG64 = 后端随机算法(用来生成 bits)
🎯 4. Generator(rng)里的全部函数(最全、分类版)
我按照 用途分类(不是文档顺序)让你真正理解。
🟦 A. 基础随机数
1. rng.random(size)
Uniform[0,1) 分布。
rng.random() # 一个数 rng.random(5) # 向量 rng.random((3,2)) # 矩阵
2. rng.uniform(low, high, size)
一般的均匀分布。
rng.uniform(5, 10, 3)
3. rng.integers(low, high, size, endpoint=False)
整数随机数(比 randint 更强)。
rng.integers(0, 10, 5)
🟦 B. 标准分布(最重要)
✔ 1. 正态分布
rng.normal(loc=0, scale=1, size=None)
✔ 2. 二项分布
rng.binomial(n, p, size)
✔ 3. 泊松分布
rng.poisson(lam, size)
✔ 4. 指数分布
rng.exponential(scale, size)
✔ 5. 伽马分布
rng.gamma(shape, scale, size)
✔ 6. 卡方分布
rng.chisquare(df, size)
✔ 7. Beta 分布
rng.beta(a, b, size)
✔ 8. 对数正态分布
rng.lognormal(mean, sigma, size)
✔ 9. F / t 分布
rng.f(dfnum, dfden, size) rng.standard_t(df, size)
✔ 10. 多元正态
rng.multivariate_normal(mean, cov, size)
(金融Monte Carlo 强烈常用)
🟦 C. 采样、随机排列、权重抽样
1. rng.choice(a, size, replace=True, p=None)
从数组里抽样。
replace=False→ 不放回
p=→ 权重
rng.choice([1,2,3], size=5, replace=True)
2. rng.permutation(x)
返回打乱后的数组。
rng.permutation(10)
3. rng.shuffle(x)
原地打乱。
🟦 D. 复杂随机数组
1. rng.bytes(length)
返回随机字节序列(密码学不安全)。
🟦 E. Beta / Dirichlet / Multinomial(机器学习常用)
1. Dirichlet
rng.dirichlet(alpha, size)
2. Multinomial
rng.multinomial(n, pvals, size)
🟦 F. 离散分布(稀有 but 完整性给你)
rng.geometric(p, size) rng.hypergeometric(ngood, nbad, nsample, size) rng.logseries(p, size)
🟦 G. 特殊分布(物理、统计专用)
rng.wald(mean, scale, size) rng.vonmises(mu, kappa, size) rng.laplace(loc, scale, size) rng.pareto(a, size) rng.weibull(a, size)
🟧 5. Generator 内部结构简图(帮助理解)
Generator │ ├── BitGenerator(e.g. PCG64) │ └── 产生随机比特 │ └── Random API(你用的函数) ├── normal() ├── integers() ├── uniform() ├── choice() └── ...
🚀 6. 为什么必须使用 rng 而不是 np.random?
功能 | np.random 旧 API | rng = np.random.default_rng() 新 API |
随机数质量 | 基于 Mersenne Twister | PCG64(更好) |
并行安全 | ❌ 不安全 | ✅ 可独立多个 rng |
全局状态污染 | ❌ 可能互相影响 | ✅ 每个 rng 独立 |
多线程 | 差 | 强 |
推荐程度 | ❌ 不推荐 | ⭐ 官方推荐 |
🎯 7. 最常用蒙特卡洛组合示例
1. 生成正态随机数
z = rng.normal(0, 1, 1_000_000)
2. 模拟股票价格(GBM)
S = S0 * np.exp((mu - .5*sigma**2)*dt + sigma*np.sqrt(dt)*z)
3. 随机抽样
samples = rng.choice(data, size=1000, replace=True)
📌 最终总结(非常重要)
✔ default_rng(seed) 只有一个参数:seed
用于控制随机种子和 reproducibility。
✔ rng(Generator)中包含大量随机函数
用于:
- 生成基础随机数
- 各种连续分布
- 各种离散分布
- 权重抽样
- 多元正态
- 洗牌/排列
- 特殊统计分布