找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3254

积分

0

好友

421

主题
发表于 前天 00:34 | 查看: 12| 回复: 0

在数据分析、统计模拟以及机器学习中,随机数生成是必不可少的环节。你是否想过,那些用于测试的样本数据、模型的初始参数,或是蒙特卡洛模拟中的随机事件,是如何被精确构造出来的?NumPy 的 numpy.random 模块正是为解决这些问题而设计的一套强大工具集。

它允许我们生成满足特定概率分布的随机数,为科学计算和数据科学实验提供可重复的随机性基础。

需要说明的是,从 NumPy 1.17 开始,官方推荐使用新的随机数生成体系(Generator 对象)。本文介绍的 numpy.random.* 函数属于传统随机数接口(legacy API),但由于其在大量现存代码与教材中仍被广泛使用,因此仍具有重要的学习和参考价值。

按照功能划分,我们可以将这些函数大致归为五类:

  1. 随机数生成器控制
  2. 均匀分布随机数
  3. 整数随机数
  4. 随机抽样与排列
  5. 常见概率分布

一、随机数生成器控制

为了保证实验的可复现性,我们经常需要固定随机序列的起点,这时就需要用到随机种子。

seed()

设置随机数种子(Random Seed)。

numpy.random.seed(seed)

参数说明

  • seed:整数种子值。

示例

import numpy as np

np.random.seed(42)
np.random.rand(3)

输出示例

[0.37454012 0.95071431 0.73199394]

说明:设置相同的 seed,在相同的 NumPy 版本与实现下,通常可以复现出完全相同的随机数序列。

二、均匀分布随机数

均匀分布(Uniform Distribution)是最基础也是最常用的随机数类型。NumPy 中部分函数名称并未直接体现 “uniform”,例如 rand()random(),但它们本质上都生成 [0, 1) 区间的均匀分布随机数。

rand()

生成 [0, 1) 区间的均匀分布随机数。

numpy.random.rand(d0, d1, ..., dn)

参数说明

  • d0, d1, ...:输出数组的形状。

示例

np.random.rand(2, 3)

输出示例

[[0.12 0.56 0.91]
 [0.44 0.32 0.77]]

说明:返回值范围为 0 ≤ x < 1

random()

生成 [0, 1) 区间的均匀分布随机数。功能与 rand() 类似,但参数指定方式不同。

numpy.random.random(size=None)

参数说明

  • size:输出数组形状,可以是一个整数或元组。

示例

np.random.random((2, 3))

uniform()

生成指定区间 [low, high) 的均匀分布随机数。

numpy.random.uniform(low=0.0, high=1.0, size=None)

参数说明

  • low:区间下限(包含)。
  • high:区间上限(通常不包含)。
  • size:输出数组形状。

示例

np.random.uniform(10, 20, size=5)

输出示例

[13.4 17.1 10.8 19.2 15.6]

三、整数随机数

除了浮点数,NumPy 也能方便地生成随机整数。

randint()

生成指定范围 [low, high) 的随机整数。

numpy.random.randint(low, high=None, size=None, dtype=int)

参数说明

  • low:最小值(包含)。
  • high:最大值(不包含)。如果 highNone,则生成范围是 [0, low)
  • size:输出数组形状。
  • dtype:输出整数的数据类型。

示例

np.random.randint(0, 10, size=5)

输出示例

[3 7 1 9 0]

说明:生成范围为 low ≤ x < high

四、随机抽样与排列

这部分函数用于从给定数据中进行随机选择或重新排列顺序。

choice()

从给定的一维数组或整数序列中随机抽取元素。

numpy.random.choice(a, size=None, replace=True, p=None)

参数说明

  • a:一维数组或整数。若为整数 n,则表示从 0n-1 的整数序列中选择。
  • size:抽样数量。
  • replace:是否允许重复抽样(有放回抽样),默认为 True
  • p:每个元素被抽中的概率分布,其长度应与 a 一致,且所有概率之和应为 1。

示例

np.random.choice([10, 20, 30, 40], size=3)

输出示例

[20 40 10]

permutation()

返回序列的随机排列(副本)。原数组不会被修改。

numpy.random.permutation(x)

参数说明

  • x:整数或数组。
    • 如果 x 为整数 n,返回 0n-1 的随机排列。
    • 如果 x 为数组,则返回数组元素的随机排列。

示例

np.random.permutation(5)

输出示例

[3 0 4 1 2]

shuffle()

原地打乱数组的顺序。注意:此函数会直接修改原数组。

numpy.random.shuffle(x)

参数说明

  • x:输入数组。

示例

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

print(a)

说明shuffle() 会直接修改原数组。对于多维数组,shuffle() 默认只打乱第一轴(即行顺序)。

五、常见概率分布

NumPy 的强大之处在于能够生成服从多种统计概率分布的随机数,这是进行复杂模拟和分析的基础。

normal()

生成正态分布(高斯分布)随机数。

numpy.random.normal(loc=0.0, scale=1.0, size=None)

参数说明

  • loc:均值(分布的中心)。
  • scale:标准差(分布的宽度)。
  • size:输出数组形状。

示例

np.random.normal(0, 1, size=5)

说明:当 loc=0, scale=1 时,生成的是标准正态分布。正态分布广泛用于描述自然误差、统计推断以及机器学习中的数据预处理。

binomial()

生成二项分布随机数。它描述了在 n 次独立的是/非试验中成功的次数。

numpy.random.binomial(n, p, size=None)

参数说明

  • n:试验次数。
  • p:每次试验成功的概率。
  • size:输出数组形状。

示例

np.random.binomial(10, 0.5, size=5)

说明:例如,模拟抛10次硬币得到正面朝上的次数。

poisson()

生成泊松分布随机数。常用于描述单位时间或空间内随机事件发生的次数。

numpy.random.poisson(lam=1.0, size=None)

参数说明

  • lam:单位时间(或单位面积)内事件发生的平均次数(λ)。
  • size:输出数组形状。

示例

np.random.poisson(3, size=5)

exponential()

生成指数分布随机数。常用于描述独立随机事件发生的时间间隔。

numpy.random.exponential(scale=1.0, size=None)

参数说明

  • scale:尺度参数(通常等于平均间隔时间的倒数 1/λ)。
  • size:输出数组形状。

示例

np.random.exponential(1.0, size=5)

gamma()

生成 Gamma 分布随机数。它是多个独立指数分布变量之和的分布,常用于描述等待时间或作为贝叶斯统计中的先验分布。

numpy.random.gamma(shape, scale=1.0, size=None)

参数说明

  • shape:形状参数(k)。
  • scale:尺度参数(θ)。
  • size:输出数组形状。

示例

np.random.gamma(2.0, 2.0, size=5)

beta()

生成 Beta 分布随机数。其值域在 [0, 1] 之间,常用于对概率本身进行建模,是贝叶斯统计中的重要分布。

numpy.random.beta(a, b, size=None)

参数说明

  • a:形状参数 α。
  • b:形状参数 β。
  • size:输出数组形状。

示例

np.random.beta(2, 5, size=5)

chisquare()

生成卡方分布随机数。这是统计学中用于假设检验(如独立性检验、拟合优度检验)的基础分布。

numpy.random.chisquare(df, size=None)

参数说明

  • df:自由度。
  • size:输出数组形状。

示例

np.random.chisquare(3, size=5)

lognormal()

生成对数正态分布随机数。如果一个变量的对数服从正态分布,那么这个变量本身就服从对数正态分布,常用于描述收入分布、粒子大小等正偏态数据。

numpy.random.lognormal(mean=0.0, sigma=1.0, size=None)

参数说明

  • mean:对应正态分布的均值(对数均值)。
  • sigma:对应正态分布的标准差(对数标准差)。
  • size:输出数组形状。

示例

np.random.lognormal(0, 1, size=5)

小结

NumPy 在 numpy.random 模块中提供的这套传统随机数函数,构成了 [Python](https://yunpan.plus/f/26-1) 科学计算生态的基石之一。从简单的均匀分布 rand(),到复杂的概率分布如 normal()gamma(),再到实用的抽样函数 choice()shuffle(),它们为数据模拟、统计分析、算法测试和机器学习实验提供了可靠且高效的随机性来源。

虽然官方推荐转向新的 Generator API 以获得更好的性能和特性,但掌握这些经典函数对于阅读和维护遗留代码、理解随机数生成的基本原理依然至关重要。希望这篇梳理能帮助你在 [云栈社区](https://yunpan.plus) 的学习和项目实践中,更加游刃有余地驾驭随机性。




上一篇:Claude日均注册量破百万登顶应用商店,ChatGPT 因合作争议用户流失
下一篇:Formily 2.3.0 JSON Schema 实战:10倍性能搞定复杂表单联动与校验
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-10 10:21 , Processed in 0.579194 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表