【NumPy】np.random.default_rng() 函数:创建随机数生成器

在 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值