随机数生成:`numpy.random` 模块详解

好的,各位亲爱的编程爱好者们,欢迎来到今天的“随机数生成:numpy.random 模块详解”专场讲座!我是你们的老朋友,一位在代码海洋里摸爬滚打多年的老水手。今天,咱们就一起扬帆起航,探索 numpy.random 这个神奇的模块,看看它如何为我们的程序注入无限的“随机性”魅力。

开场白:随机之必要,程序之灵魂

想象一下,如果你的程序永远都按照固定的路线运行,那将会是多么的枯燥乏味!就像一潭死水,毫无生机。而随机数,就像一阵清风,吹皱了水面,带来了涟漪和活力。

在游戏里,我们需要随机生成怪物的位置和属性,让玩家每次都有不同的挑战。在机器学习中,我们需要随机初始化模型的参数,避免陷入局部最优解。在模拟仿真中,我们需要随机模拟各种事件的发生,才能更真实地反映现实世界的复杂性。

总而言之,随机数是程序世界的“调味剂”,让我们的程序更加生动、有趣、实用。

第一章:numpy.random 模块概述:打开随机数的大门

numpy.random 模块是 NumPy 库中专门用于生成各种随机数的“百宝箱”。它提供了丰富的函数,可以生成各种分布的随机数,满足我们不同的需求。

首先,我们要做的就是导入这个模块:

import numpy as np

就像打开了一扇通往随机数世界的大门,让我们迫不及待地想要进去一探究竟。

第二章:随机数生成器的基石:GeneratorSeedSequence

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 模块,让随机数成为你们编程工具箱中的一把利器。

结束语:随机之美,代码之魂

随机数是程序世界的“灵魂”,它赋予了程序无限的可能性。让我们一起拥抱随机,创造出更加精彩的程序世界!

感谢大家的聆听!我们下次再见! 👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注