好的,各位亲爱的编程爱好者们,欢迎来到今天的“随机数生成:numpy.random
模块详解”专场讲座!我是你们的老朋友,一位在代码海洋里摸爬滚打多年的老水手。今天,咱们就一起扬帆起航,探索 numpy.random
这个神奇的模块,看看它如何为我们的程序注入无限的“随机性”魅力。
开场白:随机之必要,程序之灵魂
想象一下,如果你的程序永远都按照固定的路线运行,那将会是多么的枯燥乏味!就像一潭死水,毫无生机。而随机数,就像一阵清风,吹皱了水面,带来了涟漪和活力。
在游戏里,我们需要随机生成怪物的位置和属性,让玩家每次都有不同的挑战。在机器学习中,我们需要随机初始化模型的参数,避免陷入局部最优解。在模拟仿真中,我们需要随机模拟各种事件的发生,才能更真实地反映现实世界的复杂性。
总而言之,随机数是程序世界的“调味剂”,让我们的程序更加生动、有趣、实用。
第一章:numpy.random
模块概述:打开随机数的大门
numpy.random
模块是 NumPy 库中专门用于生成各种随机数的“百宝箱”。它提供了丰富的函数,可以生成各种分布的随机数,满足我们不同的需求。
首先,我们要做的就是导入这个模块:
import numpy as np
就像打开了一扇通往随机数世界的大门,让我们迫不及待地想要进去一探究竟。
第二章:随机数生成器的基石:Generator
和 SeedSequence
在 numpy.random
的世界里,随机数生成并非毫无章法。它有一个坚实的基础,那就是 Generator
(生成器)和 SeedSequence
(种子序列)。
-
Generator
:随机数的“发动机”Generator
对象是实际生成随机数的“发动机”。它基于一种叫做“伪随机数生成算法”的数学模型,通过迭代计算来产生看似随机的数字序列。你可以这样创建一个
Generator
对象:rng = np.random.default_rng()
这里的
default_rng()
函数会返回一个默认配置的Generator
对象。你可以把它想象成一个装满了随机数能量的“魔盒”。 -
SeedSequence
:随机性的“源头”SeedSequence
对象是用来初始化Generator
的“种子”。它就像一颗小小的火种,可以点燃Generator
的随机数引擎,让它开始源源不断地产生随机数。为什么需要种子呢?因为伪随机数生成算法本质上是确定性的,只要种子相同,生成的随机数序列就会完全一样。这在某些情况下非常有用,比如我们需要复现实验结果。
你可以这样创建一个
SeedSequence
对象:seed_seq = np.random.SeedSequence(12345) # 使用整数作为种子 rng = np.random.default_rng(seed_seq) # 使用 SeedSequence 初始化 Generator
这里的
12345
就是一个整数种子。你也可以使用更复杂的种子,比如一个随机的字节序列。重要提示: 如果你不指定种子,
numpy.random
会自动为你选择一个随机的种子。这意味着每次运行程序,你都会得到不同的随机数序列。对象 作用 比喻 Generator
实际生成随机数的对象,是随机数的“发动机” 魔盒 SeedSequence
初始化 Generator
的种子,决定了随机数序列的起始状态,是随机性的“源头”火种
第三章:生成均匀分布的随机数:random
, rand
, uniform
均匀分布是最简单也是最常用的随机数分布。它意味着在指定的范围内,每个数字出现的概率都是相同的。
-
random(size)
:生成[0.0, 1.0)
范围内的均匀分布随机数random()
函数可以生成指定大小的数组,其中的元素都是[0.0, 1.0)
范围内的均匀分布随机数。rng = np.random.default_rng() arr = rng.random(size=(3, 4)) # 生成一个 3x4 的数组 print(arr)
这个函数就像一个“魔术师”,轻轻一挥手,就能变出一堆在 0 到 1 之间的随机数。
-
*`rand(args)
:生成
[0.0, 1.0)` 范围内的均匀分布随机数(更方便的写法)**rand()
函数和random()
函数的功能类似,但是它的参数更加灵活,可以直接指定数组的形状。rng = np.random.default_rng() arr = rng.rand(3, 4) # 生成一个 3x4 的数组 print(arr)
这个函数就像一个“快枪手”,可以更快地生成指定形状的随机数数组。
-
uniform(low, high, size)
:生成[low, high)
范围内的均匀分布随机数uniform()
函数可以生成指定范围内的均匀分布随机数。low
参数指定范围的下界,high
参数指定范围的上界,size
参数指定数组的大小。rng = np.random.default_rng() arr = rng.uniform(low=-1.0, high=1.0, size=(2, 5)) # 生成一个 2x5 的数组,范围是 [-1.0, 1.0) print(arr)
这个函数就像一个“调色师”,可以根据你的需求,调整随机数的范围。
第四章:生成正态分布的随机数:normal
正态分布(也称为高斯分布)是自然界中最常见的分布之一。它具有钟形的概率密度函数,中心位置的概率最高,越远离中心,概率越低。
-
normal(loc, scale, size)
:生成正态分布的随机数normal()
函数可以生成指定均值和标准差的正态分布随机数。loc
参数指定均值,scale
参数指定标准差,size
参数指定数组的大小。rng = np.random.default_rng() arr = rng.normal(loc=0.0, scale=1.0, size=(1000,)) # 生成 1000 个均值为 0,标准差为 1 的正态分布随机数 print(arr) import matplotlib.pyplot as plt #导入画图的库 plt.hist(arr, bins=50) #画一个柱状图 plt.show()
这个函数就像一个“雕塑家”,可以塑造出符合正态分布的随机数形状。
第五章:生成其他分布的随机数:binomial
, poisson
, exponential
…
除了均匀分布和正态分布,numpy.random
还提供了许多其他分布的随机数生成函数,比如二项分布、泊松分布、指数分布等等。
-
binomial(n, p, size)
:生成二项分布的随机数二项分布描述的是在
n
次独立试验中,成功的次数的概率分布,每次试验成功的概率为p
。rng = np.random.default_rng() arr = rng.binomial(n=10, p=0.5, size=(100,)) # 模拟 100 次抛硬币,每次抛 10 次,统计正面朝上的次数 print(arr)
-
poisson(lam, size)
:生成泊松分布的随机数泊松分布描述的是在指定的时间或空间内,发生的事件次数的概率分布,平均发生率为
lam
。rng = np.random.default_rng() arr = rng.poisson(lam=5, size=(100,)) # 模拟 100 天内,每天发生的事件次数,平均每天发生 5 次 print(arr)
-
exponential(scale, size)
:生成指数分布的随机数指数分布描述的是事件之间的时间间隔的概率分布,平均时间间隔为
scale
。rng = np.random.default_rng() arr = rng.exponential(scale=2, size=(100,)) # 模拟 100 个事件之间的时间间隔,平均时间间隔为 2 print(arr)
分布 函数 描述 适用场景 均匀分布 random
,rand
,uniform
在指定范围内,每个数字出现的概率都是相同的 模拟等概率事件,比如抛硬币、掷骰子 正态分布 normal
具有钟形的概率密度函数,中心位置的概率最高,越远离中心,概率越低 模拟自然界中常见的现象,比如身高、体重、考试成绩 二项分布 binomial
在 n
次独立试验中,成功的次数的概率分布,每次试验成功的概率为p
模拟重复试验,比如抛硬币、射击 泊松分布 poisson
在指定的时间或空间内,发生的事件次数的概率分布,平均发生率为 lam
模拟单位时间内发生的事件次数,比如电话呼叫、顾客访问 指数分布 exponential
事件之间的时间间隔的概率分布,平均时间间隔为 scale
模拟事件发生的时间间隔,比如机器故障、顾客到达
第六章:随机打乱数组:shuffle
有时候,我们需要将数组中的元素随机打乱,比如在机器学习中,我们需要将数据集随机打乱,避免模型学习到错误的模式。
-
shuffle(x)
:原地打乱数组shuffle()
函数可以原地打乱数组x
,也就是直接修改原始数组。rng = np.random.default_rng() arr = np.array([1, 2, 3, 4, 5]) rng.shuffle(arr) # 原地打乱数组 print(arr)
这个函数就像一个“洗牌机”,可以把数组中的元素洗得乱七八糟。
第七章:随机选择元素:choice
有时候,我们需要从数组中随机选择一个或多个元素,比如在游戏中,我们需要随机选择一个角色。
-
choice(a, size, replace, p)
:从数组中随机选择元素choice()
函数可以从数组a
中随机选择size
个元素。replace
参数指定是否允许重复选择,p
参数指定每个元素被选择的概率。rng = np.random.default_rng() arr = np.array([1, 2, 3, 4, 5]) choices = rng.choice(a=arr, size=(3,), replace=True, p=[0.1, 0.2, 0.3, 0.2, 0.2]) # 从数组中随机选择 3 个元素,允许重复选择,并指定每个元素被选择的概率 print(choices)
这个函数就像一个“点名器”,可以随机点选数组中的元素。
第八章:总结与展望:随机数的无限可能
今天,我们一起探索了 numpy.random
模块的奥秘,学习了如何生成各种分布的随机数,如何随机打乱数组,如何随机选择元素。
numpy.random
模块的功能远不止于此,它还提供了许多其他高级功能,比如生成随机排列、生成随机整数等等。
随机数在计算机科学中扮演着重要的角色,它不仅可以为我们的程序增加趣味性,还可以解决许多实际问题。
希望今天的讲座能够帮助大家更好地理解和使用 numpy.random
模块,让随机数成为你们编程工具箱中的一把利器。
结束语:随机之美,代码之魂
随机数是程序世界的“灵魂”,它赋予了程序无限的可能性。让我们一起拥抱随机,创造出更加精彩的程序世界!
感谢大家的聆听!我们下次再见! 👋