🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

Python random 模块入门!通过复制粘贴即可理解的随机值生成方法

要在电脑上通过命令提示符或 PowerShell 运行 Python,需要先下载并安装 Python。
如果你还没有安装,请参考Python安装与开发环境配置一文来完成安装。

你好!你是否曾想为你的网站增添一些动感或意外之喜?比如,每次访问时都更换显示的图片,随机显示推荐文章,或者在开发过程中大量创建虚拟数据。

为了实现这种“随机性”,Python 提供了一个非常方便的标准库,名为random模块。由于是标准库,只要安装了 Python,就无需额外安装即可立即使用,是网站开发者值得信賴的好帮手。

本文将面向网页设计初学者,通过丰富的示例代码,从基础到应用,全面深入地讲解 Python random 模块的使用方法。所有示例代码都设计为“仅需复制粘贴”即可完美运行。希望你能通过“先动手尝试”,体验到生成随机数的乐趣和便利!


准备工作:导入 random 模块

首先,要使用random模块的功能,你需要在 Python 脚本的开头导入(import)该模块。写法非常简单,只需下面这一行代码。

import random

# 从这里开始,就可以使用 random 模块的功能了
print("random 模块已成功导入!")

这样,你就准备好以random.〇〇()的形式调用模块内的各种功能(函数)了。接下来,让我们逐一了解一些代表性的函数吧。


基础篇①:生成随机整数 (randint, randrange)

最常用的功能之一,是在指定范围内生成一个随机整数。在需要随机整数的场合非常多,例如“1到6之间的数字(骰子🎲)”或“100到200之间的测试分数”。

获取指定范围的整数:random.randint()

random.randint(a, b)会返回一个介于你传入的两个参数 `a` 和 `b` 之间的随机整数。重点是,这个范围是包含 a 和 b 本身(即大于等于a,小于等于b)的。

示例:生成1到6之间的随机整数(骰子)

import random

# 生成一个大于等于1,小于等于6的随机整数
dice_roll = random.randint(1, 6)

print(f"骰子的点数是: {dice_roll}")

像使用 range() 一样使用:random.randrange()

random.randrange()也用于生成整数,但其工作方式与 Python 的标准函数range()相同。因此,对于程序员来说,这种方式可能感觉更直观。

randint(a, b)不同的是,需要注意终点值(stop)不包含在范围内。

示例:生成0到9之间的随机整数(不包含10)

import random

# 生成一个大于等于0,小于10的随机整数
# 和 range(10) 的思路一样
number = random.randrange(10)

print(f"0到9之间的随机数是: {number}")

randrange()的真正价值在于当你希望按特定步长(间隔)生成随机数时。例如,可以指定“只生成偶数”或“只生成5的倍数”。

示例:生成10到100之间5的随机倍数

import random

# 从10开始,到101之前,步长为5
# 候选数字是 10, 15, 20, ..., 100
multiple_of_five = random.randrange(10, 101, 5)

print(f"10到100之间5的随机倍数是: {multiple_of_five}")

基础篇②:从列表中选择元素 (choice, choices, sample)

这个功能在网站上非常有用,比如“从推荐文章列表中随机显示一篇”或“从多个横幅图片中选择几张来显示”。它从列表或元组等集合(序列)中提取元素。

只选择一个:random.choice()

random.choice(seq)从列表或元组等序列中,随机选择仅一个元素。这是一个简单且非常易于使用的函数。

示例:选择一个抽签结果

import random

fortunes = ["大吉", "中吉", "小吉", "吉", "凶", "大凶"]

# 从列表中随机选择一个元素
result = random.choice(fortunes)

print(f"今天的运势是... {result}!")

可重复地选择多个:random.choices()

random.choices(population, k=n)从列表中选择多个元素。重点是,它允许重复(有放回抽样)。这意味着已经选中的元素可能会再次被选中。通过k来指定选择的数量。

示例:模拟抛硬币10次(正面和反面可重复出现)

import random

coin_sides = ["正面", "反面"]

# 从 coin_sides 中可重复地选择10次 (k=10)
results = random.choices(coin_sides, k=10)

print(f"抛硬币的结果是: {results}")
print(f"正面的次数: {results.count('正面')}")
print(f"反面的次数: {results.count('反面')}")

此外,choices()还可以通过指定weights(权重)来改变每个元素被选中的概率。这在需要控制概率的游戏抽卡(gacha)功能等场合非常方便。

示例:模拟稀有度高的道具掉率较低的抽卡

import random

items = ["超稀有SSR+", "SSR", "SR", "R", "N"]
#         概率:   0.5%,      3%,   15%,  30%, 51.5% 对应的权重
weights = [0.5,        3,    15,    30,   51.5]

# 考虑权重进行10次抽选
gacha_results = random.choices(items, weights=weights, k=10)

print(f"10连抽的结果是: {gacha_results}")

不重复地选择多个:random.sample()

random.sample(population, k)从列表中选择多个不重复的元素(无放回抽样)。这在“从参与者名单中不重复地抽选3名中奖者”或“确保显示的相关文章不重复”等情况下是最佳选择。

示例:从5名用户中抽选2名中奖者

import random

users = ["UserA", "UserB", "UserC", "UserD", "UserE"]

# 从 users 列表中不重复地选择2人 (k=2)
winners = random.sample(users, k=2)

print(f"恭喜中奖者!: {winners}")

基础篇③:打乱列表顺序 (shuffle)

如果你想随机打乱一个现有列表的元素顺序,可以使用random.shuffle(x)

需要注意的是,shuffle()不会返回一个新列表,而是直接修改原始列表本身(in-place操作)。因此,如果你想保留原始顺序,需要在操作前复制列表。

示例:洗牌

import random

cards = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
print(f"洗牌前: {cards}")

# 直接打乱 cards 列表本身
random.shuffle(cards)

print(f"洗牌后: {cards}")

如果你想在保留原始列表的同时,得到一个被打乱顺序的“新”列表,使用前面提到的random.sample()会很简单。只需将k指定为列表的全部元素数量,就能得到一个被打乱的新列表。

示例:保留原始列表,同时获取一个被打乱顺序的新列表

import random

original_list = [1, 2, 3, 4, 5]

# 采样数量与原始列表长度相同
shuffled_list = random.sample(original_list, k=len(original_list))

print(f"原始列表 (未改变): {original_list}")
print(f"新的被打乱的列表: {shuffled_list}")

基础篇④:生成随机小数 (random, uniform)

不仅是整数,你也可以生成包含小数点的随机数(浮点数)。这可以用于动画参数或A/B测试的比例计算等。

0.0到1.0之间的值:random.random()

random.random()是最基础的小数生成函数,它会返回一个大于等于0.0,小于1.0 ($0.0 \le N < 1.0$) 的随机浮点数。它不需要任何参数。

示例:生成一个随机浮点数

import random

value = random.random()
print(f"生成的值: {value}")

# 以70%的概率显示“成功”的示例
if value < 0.7:
    print("以70%的概率成功了!")
else:
    print("很遗憾,失败了...")

指定范围的小数:random.uniform()

如果你需要一个特定范围内的随机小数,请使用random.uniform(a, b)。它会返回一个大于等于a,小于等于b ($a \le N \le b$) 的随机浮点数。

示例:生成-1.0到1.0之间的随机小数

import random

# 生成一个-1.0到1.0之间的随机小数
random_float = random.uniform(-1.0, 1.0)

print(f"生成的小数: {random_float}")

# 如果想显示到小数点后3位
print(f"小数点后3位: {random_float:.3f}")

应用篇:可在Web制作中使用的实践范例

从这里开始,我们将介绍一些更实际的例子,这些例子结合了我们目前学到的基本函数,是网页开发者在实际开发中可能会用到的。

应用①:生成随机密码或ID字符串

当你想为测试用户生成初始密码或生成临时会话ID时,这个功能非常方便。这里,我们介绍一种结合了random.choice()、字符串操作和列表推导式的简洁写法。

import random
import string

# 定义候选字符
# string.ascii_letters 是所有英文字母 (a-z, A-Z)
# string.digits 是所有数字 (0-9)
# string.punctuation 是所有符号 (!"#$%&...)
characters = string.ascii_letters + string.digits + string.punctuation
print(f"部分候选字符: {characters[:20]}...")

# 指定密码长度
length = 16

# 使用列表推导式生成指定长度的随机字符串
# "".join(list) 将列表中的所有元素连接成一个字符串
random_password = "".join(random.choice(characters) for _ in range(length))

print(f"生成的随机字符串: {random_password}")

应用②:使用Python生成包含随机元素的HTML

Python 在 Web 后端也大显身手。这里,我们介绍一段可以动态生成包含随机内容 HTML 文件的代码。当你想高效地创建网站原型或测试数据时,这非常有用。

下面的 Python 代码每次运行时都会生成一个具有不同背景颜色和不同消息的简单 HTML 文件。

Python 代码:生成随机HTML

import random

# 1. 生成一个随机的颜色代码
# 将一个0到16777215 (FFFFFF) 之间的整数转换为十六进制
bg_color = f"#{random.randint(0, 0xFFFFFF):06x}"

# 2. 选择一个随机的消息和图标
messages = [
    ("欢迎来到 Python 的世界!", "🐍"),
    ("random 模块很方便,不是吗?", "👍"),
    ("网页设计真有趣!", "🎨"),
    ("今天也是适合编程的好日子。", "💻")
]
message, icon = random.choice(messages)

# 3. 使用f-string创建HTML结构
html_content = f"""<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>随机生成的页面</title>
    <style>
        body {{
            background-color: {bg_color};
            color: #333;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
            text-align: center;
            padding-top: 100px;
            transition: background-color 0.5s ease;
        }}
        .container {{
            background-color: rgba(255, 255, 255, 0.8);
            padding: 2em 3em;
            border-radius: 12px;
            display: inline-block;
            box-shadow: 0 8px 20px rgba(0,0,0,0.15);
            backdrop-filter: blur(10px);
        }}
        h1 {{
            font-size: 2.5rem;
        }}
    </style>
</head>
<body>
    <div class="container">
        <h1>{icon} {message}</h1>
        <p>这个页面的背景颜色是 <strong>{bg_color}</strong>。</p>
    </div>
</body>
</html>
"""

# 4. 将生成的HTML保存为名为 "random_page.html" 的文件
with open("random_page.html", "w", encoding="utf-8") as f:
    f.write(html_content)

print("已生成 `random_page.html`。请在浏览器中打开查看。")

当你运行上面的 Python 脚本时,一个名为 `random_page.html` 的文件将被创建在与脚本相同的目录中。如果你在浏览器中打开这个文件,每次都会显示一个设计不同的页面。请务必试一试。

注意事项和高级用法

随机数的可复现性:random.seed()

random模块生成的随机数实际上不是完全随机的,而是由特定计算公式(算法)生成的伪随机数。这个计算的起点是一个称为“种子(seed)”的值。

通常,种子是根据当前时间等不可预测的值自动设置的,因此每次运行时都会生成不同的随机数序列。但是,在调试或测试时,你可能希望生成“随机但每次顺序都相同的随机值”。这可以通过random.seed()实现。

如果你给random.seed()一个特定的数值(种子值),之后生成的随机数序列将被完全固定。无论你运行多少次,只要种子值相同,就会以相同的顺序出现相同的随机数。

import random

# 将种子值设置为 42
random.seed(42)
print("--- 使用种子值 42 运行 ---")
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())

print("\n--- 再次使用种子值 42 运行 ---")
# 如果再次将种子设置为相同的值,随机数序列将被重置,你会得到完全相同的结果
random.seed(42)
print(random.randint(1, 100))
print(random.choice(["A", "B", "C"]))
print(random.random())

【最重要】安全用途请使用 secrets 模块

警告:这是一个非常重要的注意事项。

我们到目前为止介绍的random模块对于统计随机性和一般用途是足够的,但它的算法是公开的,生成的随机数具有可预测性,因此它不是加密安全的

换句话说,你不应该在 Web 应用程序中对安全性至关重要的功能使用random模块,例如:

  • 生成用户密码或重置令牌
  • 会话ID或身份验证令牌
  • 生成API密钥
  • 任何其他不应被第三方猜到的秘密值

对于这些用途,你必须使用专门用于生成加密安全随机数的模块secrets,该模块自 Python 3.6 起已添加到标准库中。

secrets模块的用法与random模块非常相似,但它利用操作系统提供的最安全的随机源,使得第三方极难预测。

示例:使用 secrets 模块生成安全令牌

import secrets
import string

# --- 生成一个安全的URL适用令牌(32字节) ---
# 可用于密码重置URL等
url_safe_token = secrets.token_urlsafe(32)
print(f"安全的URL适用令牌: {url_safe_token}")


# --- 生成安全密码的示例(16个字符) ---
# 使用字母、数字和符号作为候选字符
alphabet = string.ascii_letters + string.digits + string.punctuation
# 使用 secrets.choice() 安全地选择字符
secure_password = ''.join(secrets.choice(alphabet) for i in range(16))
print(f"安全密码示例: {secure_password}")

总结

在本文中,我们详细解释了从使用 Python 的random模块生成随机数的基础知识,到 Web 开发中的实际应用示例,以及与安全相关的重要注意事项。

最后,让我们再回顾一下主要的功能。

通过掌握这些功能,你可以轻松地在 Web 开发中创建测试数据,或为用户体验增添一点惊喜和互动性。请务必复制粘贴我们介绍的代码,并通过实际运行来掌握随机生成功能!


🚀 下一步

当你熟悉了 Python 中的数据操作后,接下来可以挑战“正则表达式”——一个强大的字符串操作工具。它将使搜索和替换复杂的文本数据变得容易得多。

下一篇文章: 使用 re 模块通过正则表达式进行字符串搜索和替换