当前位置: 首页 > 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.dtcms.com/a/269480.html

相关文章:

  • AI编程的未来是智能体原生开发?
  • JavaSE-继承
  • UI前端与数字孪生结合实践案例:智慧零售的库存管理优化系统
  • 算法学习笔记:10.Prim 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 【Mac】实现Docker下载安装【正在逐步完善】
  • 【论文阅读】CogVideoX: Text-to-Video Diffusion Models with An Expert Transformer
  • 【计算机基础理论知识】C++篇(一)
  • 暑假读书笔记第四天
  • 【Python-GEE】如何利用Landsat时间序列影像通过调和回归方法提取农作物特征并进行分类
  • python transformers库笔记(BertForTokenClassification类)
  • 【牛客刷题】小红的与运算
  • node.js中yarn、npm、cnpm详解
  • 精益管理与数字化转型的融合:中小制造企业降本增效的双重引擎
  • 算法训练营DAY29 第八章 贪心算法 part02
  • 实战Linux进程状态观察:R、S、D、T、Z状态详解与实验模拟
  • 联通线路物理服务器选择的关键要点
  • No Hack No CTF 2025Web部分个人WP
  • Django双下划线查询
  • 微信小程序控制空调之接收MQTT消息
  • 如何利用AI大模型对已有创意进行评估,打造杀手级的广告创意
  • deepseek实战教程-第九篇开源模型智能体开发框架solon-ai
  • Python爬取知乎评论:多线程与异步爬虫的性能优化
  • React18+TypeScript状态管理最佳实践
  • Jenkins 使用宿主机的Docker
  • 深入解析 structuredClone API:现代JS深拷贝的终极方案
  • Ubuntu 版本号与别名对照表(部分精选)
  • Java使用接口AES进行加密+微信小程序接收解密
  • Linux Ubuntu系统下载
  • Docker企业级应用:从入门到生产环境最佳实践
  • any实现(基于LLVM中libcxx实现分析)