当前位置: 首页 > news >正文

NumPy-随机数生成详解

NumPy-随机数生成详解

    • 一、随机数生成的基础:伪随机数与种子
      • 1. 伪随机数的本质
      • 2. 种子的设置:确保结果可复现
    • 二、常用随机数生成函数
      • 1. 均匀分布随机数
      • 2. 正态分布随机数
      • 3. 整数随机数
      • 4. 其他常用分布
    • 三、随机数生成的进阶操作
      • 1. 随机排列与洗牌
      • 2. 控制随机数的维度与形状
    • 四、随机数生成的应用场景
      • 1. 数据增强
      • 2. 蒙特卡洛模拟
      • 3. 随机初始化参数
    • 五、注意事项

NumPy作为Python数值计算的核心库,提供了功能强大、性能高效的随机数生成模块——numpy.random,该模块不仅能生成各种分布的随机数,还能满足可重复性、批量生成等需求。

一、随机数生成的基础:伪随机数与种子

1. 伪随机数的本质

计算机生成的随机数并非真正意义上的随机,而是通过确定性算法产生的伪随机数。这些随机数看似无规律,但实际上由初始值(种子)完全决定。只要种子相同,生成的随机数序列就会完全一致,这一特性为实验的可重复性提供了保障。

2. 种子的设置:确保结果可复现

通过np.random.seed()函数可以设置随机数种子,固定随机数序列:

import numpy as np# 设置种子
np.random.seed(42)
# 生成随机数
print(np.random.rand(3))  # [0.37454012 0.95071431 0.73199394]# 重新设置相同种子,生成相同序列
np.random.seed(42)
print(np.random.rand(3))  # [0.37454012 0.95071431 0.73199394]

在科研实验或程序调试中,设置种子能确保多次运行的结果一致,便于问题定位和结果验证。

二、常用随机数生成函数

1. 均匀分布随机数

均匀分布是最常用的随机分布之一,其随机数在指定区间内均匀取值。

  • np.random.rand(d0, d1, ..., dn):生成[0, 1)区间内的均匀分布随机数,形状由参数指定。

    # 生成2行3列的均匀分布随机数
    arr = np.random.rand(2, 3)
    print(arr)
    # 输出:
    # [[0.59865848 0.15601864 0.15599452]
    #  [0.05808361 0.86617615 0.60111501]]
    
  • np.random.uniform(low=0.0, high=1.0, size=None):生成[low, high)区间内的均匀分布随机数,更灵活地指定范围。

    # 生成5个[10, 20)区间的均匀分布随机数
    arr = np.random.uniform(10, 20, size=5)
    print(arr)  # [12.05844943 17.8158732  11.18274425 16.17365467 12.11334366]
    

2. 正态分布随机数

正态分布(高斯分布)是自然界中最常见的分布之一,许多现象都近似遵循正态分布。

  • np.random.randn(d0, d1, ..., dn):生成均值为0、标准差为1的标准正态分布随机数。

    # 生成3个标准正态分布随机数
    arr = np.random.randn(3)
    print(arr)  # [0.49671415 -0.1382643  0.64768854]
    
  • np.random.normal(loc=0.0, scale=1.0, size=None):生成均值为loc、标准差为scale的正态分布随机数。

    # 生成2行2列、均值为5、标准差为2的正态分布随机数
    arr = np.random.normal(loc=5, scale=2, size=(2, 2))
    print(arr)
    # 输出:
    # [[4.87300259 3.87939188]
    #  [5.85916983 6.23844269]]
    

3. 整数随机数

在需要生成离散整数的场景中,以下函数非常实用。

  • np.random.randint(low, high=None, size=None, dtype=int):生成[low, high)区间内的整数随机数。

    # 生成5个[1, 10)区间的整数
    arr = np.random.randint(1, 10, size=5)
    print(arr)  # [3 7 8 5 9]
    
  • np.random.choice(a, size=None, replace=True, p=None):从数组a中随机选择元素,可指定概率分布。

    # 从[1, 2, 3]中随机选择3个元素(可重复)
    arr = np.random.choice([1, 2, 3], size=3)
    print(arr)  # [2 1 3]# 按指定概率选择元素(p的和必须为1)
    arr = np.random.choice([1, 2, 3], size=3, p=[0.1, 0.6, 0.3])
    print(arr)  # [2 2 3](2被选中的概率更高)
    

4. 其他常用分布

除了上述分布,numpy.random还支持多种其他分布的随机数生成,如指数分布、泊松分布等。

  • np.random.exponential(scale=1.0, size=None):生成指数分布随机数,scale为1/λ。

    arr = np.random.exponential(scale=2, size=3)
    print(arr)  # [1.52275333 0.88770418 3.14869517]
    
  • np.random.poisson(lam=1.0, size=None):生成泊松分布随机数,lam为λ(均值和方差)。

    arr = np.random.poisson(lam=3, size=4)
    print(arr)  # [4 2 3 5]
    

三、随机数生成的进阶操作

1. 随机排列与洗牌

在需要打乱数据顺序的场景中,随机排列函数非常有用。

  • np.random.permutation(x):返回一个随机排列的数组,或对整数序列进行随机排列。

    # 对数组进行随机排列
    arr = np.array([1, 2, 3, 4, 5])
    permuted = np.random.permutation(arr)
    print(permuted)  # [3 5 1 2 4]# 生成0-4的随机排列
    permuted = np.random.permutation(5)
    print(permuted)  # [2 4 1 0 3]
    
  • np.random.shuffle(x):原地打乱数组x的顺序(无返回值)。

    arr = np.array([1, 2, 3, 4, 5])
    np.random.shuffle(arr)
    print(arr)  # [5 2 4 1 3]
    

2. 控制随机数的维度与形状

NumPy的随机数生成函数支持通过size参数灵活指定输出数组的形状,无论是一维、二维还是更高维数组,都能轻松生成。

# 生成3维数组(2×3×4)的均匀分布随机数
arr = np.random.rand(2, 3, 4)
print(arr.shape)  # (2, 3, 4)

四、随机数生成的应用场景

1. 数据增强

在机器学习中,为了扩充训练数据、提高模型的泛化能力,常对原始数据进行随机变换,如随机裁剪、随机翻转等,这些操作都依赖于随机数生成。

# 模拟对图像进行随机水平翻转(50%概率)
def random_flip(image):if np.random.rand() > 0.5:return image[:, ::-1]  # 水平翻转return image# 假设image是一个二维图像数组
image = np.array([[1, 2, 3], [4, 5, 6]])
flipped_image = random_flip(image)
print(flipped_image)

2. 蒙特卡洛模拟

蒙特卡洛模拟通过大量随机抽样来求解复杂问题,在金融、物理等领域有广泛应用。例如,用蒙特卡洛方法估算圆周率:

n = 1000000  # 抽样次数
x = np.random.uniform(-1, 1, n)
y = np.random.uniform(-1, 1, n)
# 计算落在单位圆内的点的数量
inside = (x**2 + y**2) <= 1
pi_estimate = 4 * np.sum(inside) / n
print(pi_estimate)  # 约为3.14(随着n增大,精度提高)

3. 随机初始化参数

在机器学习模型训练前,通常需要随机初始化模型参数(如权重矩阵),正态分布和均匀分布是常用的初始化方式。

# 随机初始化一个3×2的权重矩阵(均值0,标准差0.01)
weights = np.random.normal(loc=0, scale=0.01, size=(3, 2))
print(weights)
# 输出:
# [[-0.00463418 -0.00465729]
#  [ 0.01523029  0.00375698]
#  [-0.00634322 -0.00362741]]

五、注意事项

  1. 种子的作用范围np.random.seed()设置的种子只对后续的numpy.random模块函数有效,且在多线程环境中可能会出现种子混乱的问题,此时可使用numpy.random.RandomState创建独立的随机数生成器。

    # 创建独立的随机数生成器
    rng = np.random.RandomState(42)
    print(rng.rand(3))  # [0.37454012 0.95071431 0.73199394]
    
  2. 性能考量:NumPy的随机数生成函数底层由C实现,性能远优于Python原生的random模块,尤其在生成大规模随机数时,优势更为明显。

  3. 分布参数的选择:不同的应用场景需要选择合适的分布。例如,初始化神经网络权重时,常用正态分布或均匀分布;模拟等待时间时,常用指数分布。

That’s all, thanks for reading~~
觉得有用就点个赞、收进收藏夹吧!关注我,获取更多干货~

http://www.lryc.cn/news/582515.html

相关文章:

  • 初识单例模式
  • 【网络安全】服务间身份认证与授权模式
  • 【Flutter】面试记录
  • Next.js 实战笔记 2.0:深入 App Router 高阶特性与布局解构
  • 算法训练营DAY29 第八章 贪心算法 part02
  • ubuntu 操作记录
  • Python语言+pytest框架+allure报告+log日志+yaml文件+mysql断言实现接口自动化框架
  • 机制、形式、周期、内容:算法备案抽检复审政策讲解
  • 探索下一代云存储技术:对象存储、文件存储与块存储的区别与选择
  • 光流 | 当前光流算法还存在哪些缺点及难题?
  • ReactNative【实战系列教程】我的小红书 4 -- 首页(含顶栏tab切换,横向滚动频道,频道编辑弹窗,瀑布流布局列表等)
  • 闲庭信步使用图像验证平台加速FPGA的开发:第五课——HSV转RGB的FPGA实现
  • Java连接Emqx实现订阅发布消息
  • 恒创科技:香港站群服务器做seo站群优化效果如何
  • ReactNative【实战】瀑布流布局列表(含图片自适应、点亮红心动画)
  • Rust DevOps框架管理实例
  • ffmpeg下编译tsan
  • iOS 性能测试工具全流程:主流工具实战对比与适用场景
  • cocos2dx3.x项目升级到xcode15以上的iconv与duplicate symbols报错问题
  • CSP-S模拟赛二总结(实际难度大于CSP-S)
  • 力扣 239 题:滑动窗口最大值的两种高效解法
  • Android kotlin 协程的详细使用指南
  • C++--AVL树
  • 微前端框架对比
  • (16)Java+Playwright自动化测试-iframe操作-监听事件和执行js脚本
  • 精益管理与数字化转型的融合:中小制造企业降本增效的双重引擎
  • Nexus zkVM 3.0 及未来:迈向模块化、分布式的零知识证明
  • 生成PDF文件(基于 iText PDF )
  • Android framework修改解决偶发开机时有两个launcher入口的情况
  • Prompt Injection Attack to Tool Selection in LLM Agents