作者:书到用时方恨少!
发布日期:2026年3月28日
阅读时长:约15分钟
📌 前言
大家好,今天跟大家分享的是random模块,在Python 的众多内置模块中,random 是一个非常实用但又容易被低估的工具。它提供了生成伪随机数的各种方法,广泛应用于游戏开发 、数据模拟 、机器学习数据划分 、抽奖系统等领域。
无论你是刚接触 Python 的新手,还是希望深入理解其特性的开发者,这篇博客都将带你全面掌握 random 模块。我们将从基础用法讲起,逐步深入到高级技巧,并通过大量代码示例帮助你巩固理解。
1. 📦 random 模块简介
random 模块是 Python 标准库的一部分,因此无需额外安装,直接导入即可使用:
python
import random
它基于 梅森旋转算法(Mersenne Twister) 生成伪随机数。所谓"伪随机",是指生成的数字序列看起来是随机的,但实际上是确定性的------只要给定相同的种子(seed),每次运行都会得到相同的序列。这在调试 和实验复现中非常有用。
2. 🔢 基本随机数生成
🎲 random.random()
返回 [0.0, 1.0) 范围内的随机浮点数,即包含 0.0,但不包含 1.0。
python
import random
print(random.random()) # 示例输出: 0.37444887175646646
print(random.random()) # 示例输出: 0.9507143064099162
这是所有随机数生成中最基础的函数,其他许多函数都可以基于它实现。
📏 random.uniform(a, b)
返回 [a, b] 或 [a, b) 范围内的随机浮点数(取决于边界舍入),通常用于生成指定区间的随机浮点数。
python
print(random.uniform(1, 10)) # 示例输出: 5.239548159328467
print(random.uniform(5, 5)) # 始终返回 5.0
注意 :当
a ≤ b时,结果在[a, b]内;当a > b时,自动处理为[b, a]。
3. 🎯 随机整数生成
🔢 random.randint(a, b)
返回 [a, b] 范围内的随机整数,包含两端。
python
print(random.randint(1, 10)) # 可能是 1 到 10 中的任意整数
🧮 random.randrange(start, stop[, step])
与 range() 的用法类似,返回从 start 到 stop(不包含 stop)之间按 step 步长选取的随机整数。
python
print(random.randrange(10)) # 0 到 9 之间的整数
print(random.randrange(1, 10)) # 1 到 9 之间的整数
print(random.randrange(0, 100, 5))# 0,5,10,...,95 中的随机一个
提示 :
randint(a, b)实际上等价于randrange(a, b+1)。
4. 🃏 序列相关随机操作
随机模块在序列(列表、元组、字符串等)上的操作非常实用。
🎲 random.choice(seq)
从非空序列中随机选择一个元素。
python
colors = ['red', 'blue', 'green', 'yellow']
print(random.choice(colors)) # 每次随机一种颜色
🔁 random.choices(population, weights=None, cum_weights=None, k=1)
从序列中随机选择 k 个元素(允许重复),并可以指定权重。
python
# 等概率抽取 3 个元素(可能重复)
print(random.choices(colors, k=3))
# 带权重的抽取
weights = [10, 1, 1, 1] # red 被选中的概率是 10/13
print(random.choices(colors, weights=weights, k=5))
如果使用 cum_weights(累计权重),可以避免重复计算。
📌 random.sample(population, k)
从序列中随机选择 k 个不重复的元素 ,返回一个新列表。当 k 大于序列长度时会报错。
python
print(random.sample(colors, 2)) # 随机抽取两种颜色,不重复
sample 还可以用于洗牌后的选区,且不会修改原序列。
🔀 random.shuffle(x)
就地打乱 一个可变序列(如列表)。注意:该方法返回 None,直接修改原列表。
python
cards = list(range(1, 11))
random.shuffle(cards)
print(cards) # 顺序被打乱
5. 📊 其他分布函数
除了均匀分布,random 模块还提供了几种常见概率分布的生成函数,适合科学计算 和模拟。
📈 正态分布(高斯分布)
random.gauss(mu, sigma) 或 random.normalvariate(mu, sigma)
mu:均值sigma:标准差
python
# 生成一个均值为 0,标准差为 1 的正态分布随机数
print(random.gauss(0, 1))
normalvariate 的算法略有不同,但用法一致。
📉 其他分布
random.betavariate(alpha, beta):Beta 分布random.expovariate(lambd):指数分布random.gammavariate(alpha, beta):Gamma 分布random.lognormvariate(mu, sigma):对数正态分布random.paretovariate(alpha):帕累托分布random.triangular(low, high, mode):三角分布random.vonmisesvariate(mu, kappa):冯·米塞斯分布random.weibullvariate(alpha, beta):威布尔分布
这些函数在概率统计模拟中非常有用。
6. 🌱 种子与可复现性
因为 random 模块生成的是伪随机数 ,我们可以通过设置种子(seed)来使得每次运行生成的随机序列相同,这在测试 和调试中至关重要。
python
random.seed(42) # 设置种子
print(random.random()) # 固定输出: 0.6394267984578837
print(random.randint(1,10)) # 固定输出: 6
random.seed(42) # 再次设置相同种子
print(random.random()) # 再次得到 0.6394267984578837
print(random.randint(1,10)) # 再次得到 6
如果不设置种子,Python 会根据系统时间自动初始化,因此每次运行结果都不同。
7. 🔐 安全随机数
⚠️ 重要 :
random模块的随机数生成器不适合用于安全敏感的场景 (如密码、令牌生成),因为它是可预测的。如果需要加密安全的随机数,应使用secrets模块 (Python 3.6+)或os.urandom()。
示例(安全随机整数):
python
import secrets
secure_token = secrets.token_hex(16) # 生成 32 位十六进制字符串
print(secure_token)
8. 💡 高级技巧与实战案例
🔠 随机打乱字符串
字符串是不可变序列,不能直接 shuffle,但可以转换成列表再操作:
python
s = "hello"
lst = list(s)
random.shuffle(lst)
shuffled = ''.join(lst)
print(shuffled) # 如 'lehlo'
⚖️ 带权重的随机抽样(不重复)
如果希望按权重抽取不重复的样本,可以使用 random.choices 结合 set 或循环实现,但效率较低。下面是一个简单实现:
python
def weighted_sample(population, weights, k):
"""按权重抽取不重复的 k 个元素(要求 k <= len(population))"""
if k > len(population):
raise ValueError("k 不能大于总体数量")
indices = list(range(len(population)))
result = []
for _ in range(k):
chosen = random.choices(indices, weights=weights)[0]
result.append(population[chosen])
# 移除已选中的索引和对应权重,避免重复
pos = indices.index(chosen)
del indices[pos]
del weights[pos]
return result
注意:每次移除后需重新计算权重,效率较低,但适用于小规模数据。
🔢 随机生成验证码
python
import random
import string
def generate_captcha(length=6, use_digits=True, use_letters=True):
pool = ''
if use_digits:
pool += string.digits
if use_letters:
pool += string.ascii_letters
if not pool:
raise ValueError("至少选择一种字符类型")
return ''.join(random.choices(pool, k=length))
print(generate_captcha(4)) # 如 'aB3c'
print(generate_captcha(6, True, False)) # 纯数字
🎲 模拟掷骰子
python
def roll_dice(sides=6):
return random.randint(1, sides)
print(roll_dice()) # 模拟掷一次六面骰子
📊 随机划分数据集(训练/测试)
在机器学习中,常用随机方法划分数据集:
python
data = list(range(100)) # 假设有 100 个样本
random.shuffle(data)
train_ratio = 0.8
split_point = int(len(data) * train_ratio)
train_set = data[:split_point]
test_set = data[split_point:]
print(len(train_set), len(test_set))
📅 生成随机日期
结合 datetime 模块:
python
import datetime
import random
start = datetime.date(2020, 1, 1)
end = datetime.date(2025, 12, 31)
delta = end - start
random_days = random.randint(0, delta.days)
random_date = start + datetime.timedelta(days=random_days)
print(random_date)
9. ⚙️ 性能与注意事项
- 线程安全 :在 Python 中,
random模块的全局生成器是线程安全的(因为使用了锁),但如果你在多线程中频繁调用,可能成为瓶颈。此时可以为每个线程创建独立的Random实例。
python
r = random.Random()
r.seed(123)
print(r.random())
- 性能对比 :
random.random()比random.uniform()稍快,因为后者有额外的边界转换。在大量生成时,可考虑使用numpy.random提升性能。
10. 🎯 总结
通过本文,我们全面学习了 Python random 模块的:
- ✅ 基本随机数生成(
random,uniform) - ✅ 整数生成(
randint,randrange) - ✅ 序列操作(
choice,choices,sample,shuffle) - ✅ 概率分布(正态分布等)
- ✅ 种子控制与可复现性
- ✅ 安全性注意事项
- ✅ 实战案例
random 模块虽小,但功能强大,是 Python 开发者工具箱中不可或缺的一部分。希望你能将这些知识灵活运用于实际项目中。
如果在学习过程中遇到问题,欢迎在评论区留言交流。感谢阅读,我们下篇见! 🚀