展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > 如何在Python中生成随机值?

如何在Python中生成随机值?

介绍生成随机值的能力是一项重要的编程技能。即使你不是每天都需要它们,随机值仍然会出现在数量惊人的地方。当然,对于许多人来说,当他们想到随机值时,首先想到的是与游戏相关的用例,如洗牌、掷骰子和老虎机。然而,随机值还有许多其他用途。这些包括:生成安全密码或密码重置URL。创建用于测试用例或代码演示的示例数据。清理个人身份信息(PII)数据以准备数据以供分析。与许多其他重要的编程任务一样,Python编程语言具有设计良好、一致的支持,可以生成随机值,作为Python标准库的一部分。一些相关模块包括random模

本文目录

    介绍

    生成随机值的能力是一项重要的编程技能。即使你不是每天都需要它们,随机值仍然会出现在数量惊人的地方。当然,对于许多人来说,当他们想到随机值时,首先想到的是与游戏相关的用例,如洗牌、掷骰子和老虎机。

    然而,随机值还有许多其他用途。这些包括:

    • 生成安全密码或密码重置 URL。

    • 创建用于测试用例或代码演示的示例数据。

    • 清理个人身份信息 (PII) 数据以准备数据以供分析。

    与许多其他重要的编程任务一样,Python编程语言具有设计良好、一致的支持,可以生成随机值,作为Python标准库的一部分。一些相关模块包括random模块、secrets 模块和uuid模块。secrets模块提供加密性强的随机数,而random模块提供安全性较差的数字,可用于游戏、测试数据、模拟等。下面将讨论这两种类型的随机值之间的差异。

    随机值与伪随机值

    “真”随机数和伪随机数之间的主要区别:伪随机数生成器使用一种算法生成看似随机但具有确定性的数字序列。事实上,它们是如此确定,给定相同的种子值(或起始值),它们将可靠地生成相同的数字序列!另一方面,随机数生成器依赖物理过程来创建真正随机的数字。

    虽然伪随机数生成器适用于许多用途,但它们不适用于需要真正随机性的应用,如密码学。这是因为知道算法的人可以预测序列中的下一个数字。因此,真正的随机数生成器对于安全关键应用至关重要。

    随机和加密

    正如我们在上一节中所讨论的,如果我们正在编写游戏或模拟数据,random模块是很好的。然而,如果我们处理授权令牌或其他安全数据,我们需要secrets模块。

    随机模块

    这两个模块之间还有其他区别。random模块是这两个模块中较老的一个,自Python版本1以来一直存在。它有一个大型函数接口,本质上是一个类的共享实例random.Random的包装器。然而,你始终可以构造自己的随机类并使用它。random.Random可以用已知种子实例化随机类,以给出可复制的随机数序列。如果缺失,将使用基于系统计时器的种子值。

    此示例显示了选择种子对random.Random类的影响:

    """Creating random integers demo"""
    from random import Random, randint
    
    seed = 42
    seeded_1 = Random(seed)
    seeded_2 = Random(seed)
    randomly_seeded = Random()
    
    # Get a random number between 1 and 1000, inclusive
    print(seeded_1.randint(1, 1000))
    print(seeded_2.randint(1, 1000))
    print(randomly_seeded.randint(1, 1000))
    
    # Use the functional interface
    print(randint(1,1000))
    655
    655
    161
    956

    随机类的两个实例使用相同的种子实例化,生成了前两行输入。每次运行程序时,这些行打印655。(试试看!)。

    最后两行是使用随机种子实例和函数接口(也是随机种子)创建的。代码随每次运行而变化,在这两行的情况下,数字排列的任何运行都是完全重合的。

    加密模块

    乍一看,在PEP 506中首次描述并首次出现在Python 3.6中的secrets模块看起来与Python随机模块非常不同。许多函数接口包装器都已经消失,因此,例如,你不能直接导入randint。此外,还有secrets.SystemRandom类将忽略你可能传递给它的任何种子值。

    然而,如果我们在这些表面差异的下面进行描述,这两个类非常相似,实际上,从源代码来看:

    • secrets.SystemRandom类实际上是random.SystemRandom类的别名。

    • random.SystemRandom是random.Random的子类。因此,一般来说,一个系统中可用的功能在另一个系统也可用。(两个例外是getstate和setstate,它们没有在SystemRandom中实现)。

    内部最显著的区别是SystemRandom中的核心“随机化”行为是根据os.urandom实现的。反过来,urandom函数被传递一个整数,并使用依赖于平台的加密强随机值生成器返回许多随机字节。

    我们现在知道我们可以使用这两个类中的任何一个,它们基本上是可互换的,但secrets.SystemRandom将更真实地随机,因此在更安全的环境中使用。

    考虑到这一点,接下来让我们看一些用例。

    生成随机数

    Randint和Randrange

    我们已经了解了如何使用randint在特定范围内生成随机数。randrange函数非常相似,只是它不包括上限,而randint的上限是包含的。如果你足够频繁地运行这段代码,第一行输出会出现5,但第二行不会。

    from secrets import SystemRandom
    rand = SystemRandom()
    
    # Integers betewen 1 and 5, inclusive
    print(rand.randint(1,5))   
    
    # Integers between 1 and 5, but not including 5
    print(rand.randrange(1,5))

    生成随机分布

    Random和SystemRandom共享了几种方法,允许你根据各种分布生成随机值。这些包括均匀分布(获得两个端点之间的浮点值,类似于randint提供的)、高斯(正态)分布等。

    例如,我们可以创建一个包含20个虚拟IQ值的列表,这些值沿着与真实人群相同的正态曲线随机分布。根据定义,智商的平均值为100,标准差为15。(顺便说一句,为了本示例的目的,我们希望对这种分布建模,即使我们忽略了对这个想法和我们如何测试它提出的合理批评。)

    以下是随机创建 20 个 IQ 的“群体”的代码:

    """IQ distribution"""
    from secrets import SystemRandom
    rand = SystemRandom()
    population = [round(rand.gauss(100, 15)) for _ in range(0,20)]
    print(population)

    当然,输出会有所不同。这是一个有代表性的运行:

    [102, 90, 88, 82, 102, 93, 127, 121, 94, 107, 103, 80, 106, 106, 84, 107, 108, 88, 123, 121]

    在Python中进行随机选择

    在其他语言中,从列表或其他序列中进行选择通常需要两个步骤。首先,你得到一个从0到列表上界(长度减1)的随机数。然后将该索引应用于列表以选择元素。在Python中,choice和chchoicesices这两种方法使你能够同时执行这两个步骤。这使得从任何类型的序列中选择所需大小的随机样本非常容易。

    例如,给定上面的代码,假设我们想要获取IQ的总体,并从中选择一个或多个值。下面是我们可以快速完成的方法:

    # Select one IQ at random
    print(rand.choice(population))
    
    # Select four IQs at random
    print(rand.choices(population, k=4))

    输出(示例):

    102
    [107,102,88,103]

    如何使用 Python 生成随机字符串

    因为在Python中使用随机方法很容易从序列中选择随机选项。通过Random.choice或者Random.choices函数,在Python中创建随机字符串也很简单。此外,secrets模块定义了一些特殊的函数,根据你的需要,也可以使用这些函数。

    让我们首先看看一种通用方法,你可以使用它生成多种类型的字符串。字符串模块包括几个基本上是硬编码字符序列的字符串,例如ascii_lowercase(a-z)、ascii_uppercase(A-Z)、ascii_letters、punctuation和digits。Random.choices或者SystemRandom.choices可以调用其中任何一个来创建所需长度的数组,然后可以使用str类的join方法将数组转换为新字符串。

    我们在以下示例中结合了这些步骤:

    from string import ascii_letters, digits, punctuation, ascii_lowercase, ascii_uppercase
    from secrets import SystemRandom
    rand = SystemRandom()
    
    four_digits = "".join(rand.choices(digits, k=4))
    ten_mixed_case = "".join(rand.choices(ascii_letters, k=10))
    assorted = ascii_letters + punctuation
    twenty_assorted = "".join(rand.choices(assorted, k=20))
    
    print(four_digits)
    print(ten_mixed_case)
    print(twenty_assorted)

    代码输出:

    8782
    PLZYOxFLoQ
    !mNsKsF;([I#F(c

    使用Secrets模块加密随机字符串

    除了如上所示轻松创建随机字符串外,secrets模块还提供了几个函数,可用于生成各种格式的随机字节序列。在最低级别,我们可以使用token_bytes函数生成各种长度的原始“字节”数组。

    from secrets import token_bytes
    b = token_bytes(10)
    print(type(b))
    print(b)

    代码输出:

    
    b'!\x05P\xc6a\x87\xf9~(\xa9'

    原始字节作为加密算法或类似算法的输入可能很有用,但请记住,它们不会包含有效的UTF-8代码点,因此不应使用此函数生成字符串。要获取字符串,可以使用上一节中的技术或下面两个函数中的一个。

    我们可以返回一个字符串,它不是以原始格式获取字节,而是以十六进制格式再次由随机字节组成。这为每个字节提供了两个十六进制输出字符:

    from secrets import token_hex
    token = token_hex(10)
    print(f"Returned a {type(token)} of length: {len(token)}:")
    print(token)

    代码输出:

    Returned a  of length: 20:

    同一系列中的第三个功能——在某些方面可能是最有用的——是token_urlsafe。此函数允许我们将随机字节字符串转换为稍微修改的base64编码字符串。在这里,每个字节平均产生1.3个字符,结果可以安全地用作URL-例如,表示缩短的URL或用作密码重置令牌。另一个好处是字符串来自比16位token_hex更大的潜在随机字符集。

    from secrets import token_urlsafe
    token = token_urlsafe(15)
    print(token)

    代码输出:

    gfN2nGjO7izMPyXs5tvU

    使用UUID:在Python中生成随机且唯一的值

    虽然我们在本文中的重点是随机值,但我们现在想花一些时间讨论对于所有实际目的来说都是随机和唯一的值。解决这个问题的一种非常普遍的方法是通用唯一标识符(UUID)的概念。UUID是一个128位的数字,不能100%保证是唯一的,但在统计上很可能是唯一的,以至于发生冲突的机会非常小。

    除了大数字之外,UUID还共享一种通用的表示格式。128位的数字可以表示为32个十六进制数字,而UUID添加四个连字符以形成一个36个字符的字符串,以8-4-4-6-12的模式排列。例如:

    '967909e3-7231-4040-aae4-8b6b2fb96a0b'

    Python模块uuid有几个不同的函数,对应于许多公认的算法,用于创建此类标识符,但建议使用两种最常见的类型之一,uuid1和uuid4。

    uuid1值是通过将网络节点id(通常意味着网卡的mac地址)与有关UUID版本和变体的少量信息以及表示高分辨率时间戳的许多位相结合来创建的。

    相反,uuid4值通常包含用于存储版本和变体信息的6位,以及122位纯随机数据。因此,根据维基百科,尽管原则上可能存在两个uuid4值的冲突,但在实践中,“在103万亿个版本4 UUIDs中找到重复的概率是十亿分之一。”。

    你可以使用Python uuid模块轻松创建uuid1和uuid4值。正如我们将看到的,字符串表示看起来是相同的,尽管描述uuid1字段中的位更有意义。

    from uuid import uuid1, uuid4
    
    print(uuid1())
    print(uuid4())

    代码输出:

    bfc89f3e-e6ab-11ec-abfc-4a9b744d17b8
    025586c2-50ed-41a6-ae31-bf96b9d79df2

    与本文中的大多数内容一样,当我们说“示例输出”时,实际上只是他代码运行其中一次的结果。当然,至少在uuid4的情况下,如果你运行这段代码103万亿次,你有十亿分之一的机会得到与我相同的结果。

    在结束对UUID的讨论之前,我们在这里提到它们,因为它们是一个被广泛接受的标准,但正如我们所看到的,uuid4的实现与系统模块中的许多实用函数之间有很多重叠。例如,我经常看到uuid4函数用于在数据库中生成主键,特别是在NoSQL上下文中,其中可能不支持自动递增字段。原则上,人们也可以使用secrets.token_hex用于同样的任务,但uuid4可能会使代码的意图更加清晰。

    附上产生随机数分布的图以及代码实现:

    import random
    import matplotlib.pyplot as plt
    
    x = [random.randint(1, 100) for n in range(100)]
    y = [random.randint(1, 100) for n in range(100)]
    plt.figure(figsize=(8,6), dpi=80)
    plt.scatter(x, y)
    plt.show()

    结果:

    如何在Python中生成随机值?

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。