在 NumPy 中,np.random.default_rng()
是一个用于创建随机数生成器的函数,推荐用于生成高质量的随机数。它是 NumPy 1.17 及以上版本中引入的现代随机数生成接口,相比旧的 np.random
模块(如 np.random.rand()
),提供了更好的性能、灵活性和可重现性。
1. 功能
np.random.default_rng()
创建一个随机数生成器对象(numpy.random.Generator
),用于生成各种随机数(如均匀分布、正态分布、整数等)。它基于 PCG-64(Permuted Congruential Generator)算法,生成速度快且随机性强。
2. 语法
rng = np.random.default_rng(seed=None)
- 参数:
seed
:可选,整数或 None。用于设置随机种子以确保可重现性。如果不指定种子,每次运行生成的结果不同。
- 返回值:
- 一个
Generator
对象,可调用其方法生成随机数。
- 一个
3. 常用方法
创建 rng
后,可以通过其方法生成随机数,例如:
rng.random(size)
:生成 [0, 1) 区间内的均匀分布随机数。rng.integers(low, high, size)
:生成指定范围内的随机整数(包含low
,不包含high
)。rng.normal(loc, scale, size)
:生成正态分布随机数(均值为loc
,标准差为scale
)。rng.choice(a, size, replace=True)
:从数组a
中随机抽样。
4. 代码示例
import numpy as np
# 创建随机数生成器,设置种子以确保可重现
rng = np.random.default_rng(seed=42)
# 生成 5 个 [0, 1) 均匀分布随机数
uniform = rng.random(5)
print("均匀分布:", uniform)
# 生成 3 个 0 到 9 的随机整数
integers = rng.integers(0, 10, size=3)
print("随机整数:", integers)
# 生成 4 个均值为 0,标准差为 1 的正态分布随机数
normal = rng.normal(0, 1, size=4)
print("正态分布:", normal)
# 从列表中随机选择 2 个元素
choices = rng.choice(['a', 'b', 'c'], size=2, replace=True)
print("随机选择:", choices)
输出示例:
均匀分布: [0.77395605 0.43887844 0.85859792 0.69736803 0.09417735]
随机整数: [0 7 6]
正态分布: [-0.97649514 0.19260928 -0.58336827 -0.44243558]
随机选择: ['c' 'b']
5. 与旧接口的区别
- 旧接口:
np.random.rand()
,np.random.randint()
等直接调用全局随机数生成器,基于 Mersenne Twister 算法。缺点是全局状态可能导致不可控的可重现性问题。 - 新接口:
np.random.default_rng()
创建独立的生成器对象,线程安全,支持并行计算,且种子管理更明确。
6. 注意事项
- 种子设置:为了结果可重现,始终在创建
rng
时指定seed
。不要在同一程序中重复创建多个rng
对象使用相同种子,否则可能导致相关性问题。 - 性能:新接口在生成大量随机数时通常比旧接口更快。
- 向后兼容:旧接口仍然可用,但推荐新项目使用
default_rng()
。
7. 常见问题
- 为什么用
default_rng
而不是np.random.rand
?
因为default_rng
提供了更现代的 API,支持并行计算和更好的种子管理,适合复杂项目。 - 如何确保结果可重现?
设置seed
参数,例如rng = np.random.default_rng(seed=123)
。