Python random 模块使用指南:从入门到精通

作者:书到用时方恨少!

发布日期: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() 的用法类似,返回从 startstop不包含 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 开发者工具箱中不可或缺的一部分。希望你能将这些知识灵活运用于实际项目中。

如果在学习过程中遇到问题,欢迎在评论区留言交流。感谢阅读,我们下篇见! 🚀

相关推荐
第一程序员2 小时前
Python 4.0正式发布:新特性与学习建议
python·github
客卿1232 小时前
牛客刷题--找数字-- 字符串检测-字符串 双指针
java·开发语言
IAUTOMOBILE2 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
威联通安全存储3 小时前
破除“重前端、轻底层”的数字幻象:如何夯实工业数据的物理底座
前端·python
Amour恋空3 小时前
Java多线程
java·开发语言·python
小陈工3 小时前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
第二只羽毛3 小时前
C++ 高并发内存池1
大数据·开发语言·c++·开源
不想看见4043 小时前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
智算菩萨3 小时前
【OpenGL】10 完整游戏开发实战:基于OpenGL的2D/3D游戏框架、物理引擎集成与AI辅助编程指南
人工智能·python·游戏·3d·矩阵·pygame·opengl