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()相同。因此,对于程序员来说,这种方式可能感觉更直观。
randrange(stop): 大于等于0,小于stop的整数。randrange(start, stop): 大于等于start,小于stop的整数。randrange(start, stop, step): 从start到stop(不含)范围内,按step间隔的整数。
与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 开发中的实际应用示例,以及与安全相关的重要注意事项。
最后,让我们再回顾一下主要的功能。
- 整数:
random.randint(a, b)(包含a, b),random.randrange(start, stop)(不包含stop) - 元素选择:
random.choice(seq)(一个),random.choices(seq, k=n)(n个,可重复),random.sample(seq, k=n)(n个,不重复) - 重新排序:
random.shuffle(x)(直接修改原始列表) - 小数:
random.random()(0.0到1.0),random.uniform(a, b)(a到b的范围) - 可复现性:
random.seed(value)(固定随机数序列) - 安全性: 密码和令牌务必使用
secrets模块!
通过掌握这些功能,你可以轻松地在 Web 开发中创建测试数据,或为用户体验增添一点惊喜和互动性。请务必复制粘贴我们介绍的代码,并通过实际运行来掌握随机生成功能!
🚀 下一步
当你熟悉了 Python 中的数据操作后,接下来可以挑战“正则表达式”——一个强大的字符串操作工具。它将使搜索和替换复杂的文本数据变得容易得多。
下一篇文章: 使用 re 模块通过正则表达式进行字符串搜索和替换