1. random 模块 #
random 是 Python 内置的伪随机数模块,可以生成随机整数/浮点数、打乱序列、做加权抽样等。虽然是“伪随机”,但对教学、测试、小游戏足够使用。使用前无需额外安装(Windows、macOS 都一样),直接 import random 即可。
2. 环境确认 #
推荐在命令行确认 Python 版本,确保代码示例可运行。
# 说明:在 Windows PowerShell 下查看 Python 版本
python --version# 说明:在 macOS / Linux 终端查看 Python 版本
python3 --version3. 基础随机数函数 #
本节介绍最常用的随机数生成方式。所有示例都包含注释,直接复制即可运行。
3.1 random.random():0~1 之间的浮点数 #
# 说明:导入 random 模块以生成随机浮点数
import random
# 说明:循环三次生成 [0.0, 1.0) 的浮点数
for i in range(3):
value = random.random()
# 说明:格式化输出结果
print(f"第 {i + 1} 次生成的随机数:{value:.4f}")3.2 randint(a, b):整数(含两端) #
# 说明:导入 random 模块以生成随机整数
import random
# 说明:生成 1~6 的整数,模拟掷骰子
print("掷骰子结果:", random.randint(1, 6))
# 说明:生成 0~100 的随机整数
print("0~100 的随机整数:", random.randint(0, 100))3.3 uniform(a, b):任意区间浮点 #
# 说明:导入 random 模块以生成浮点数
import random
# 说明:生成 0~1 区间随机浮点数
print("0~1 浮点数:", random.uniform(0, 1))
# 说明:生成 2.5~5.5 区间随机浮点数
print("2.5~5.5 浮点数:", random.uniform(2.5, 5.5))4. 序列相关操作 #
random 对序列(列表/元组/字符串)也提供了便利方法。
4.1 choice(seq):随机取一个元素 #
# 说明:导入 random 模块以便从序列中挑选元素
import random
# 说明:准备水果列表
fruits = ["apple", "banana", "orange", "grape"]
# 说明:随机选择一个水果并输出
print("随机水果:", random.choice(fruits))4.2 choices(population, weights=None, k=1):可带权重、有放回 #
# 说明:导入 random 模块以进行加权抽样
import random
# 说明:准备水果和对应权重
fruits = ["apple", "banana", "orange"]
weights = [0.1, 0.6, 0.3]
# 说明:进行 5 次抽样
print("带权重抽取:", random.choices(fruits, weights=weights, k=5))4.3 sample(population, k):无放回抽样 #
# 说明:导入 random 模块以进行无放回抽样
import random
# 说明:准备参赛者名单
participants = ["Alice", "Bob", "Charlie", "David", "Eve"]
# 说明:随机抽取 2 名获奖者
winners = random.sample(participants, 2)
print("获奖者:", winners)4.4 shuffle(seq):原地洗牌 #
# 说明:导入 random 模块以打乱序列
import random
# 说明:准备一副牌
cards = ["A", "2", "3", "4", "5", "J", "Q", "K"]
# 说明:原地打乱顺序
random.shuffle(cards)
print("打乱后的牌:", cards)5. 常见概率分布 #
random 支持多种分布生成,以下示例展示最常见的几种。
5.1 正态分布(高斯分布) #
# 说明:导入 random 模块以生成正态分布样本
import random
# 说明:生成 5 个均值为 0、方差为 1 的样本
values = [random.gauss(mu=0, sigma=1) for _ in range(5)]
print("标准正态分布样本:", values)5.2 其他分布示例 #
# 说明:导入 random 模块以生成不同分布的样本
import random
# 说明:生成指数分布样本
print("指数分布:", random.expovariate(1.0))
# 说明:生成伽马分布样本
print("伽马分布:", random.gammavariate(alpha=2.0, beta=2.0))
# 说明:生成贝塔分布样本
print("贝塔分布:", random.betavariate(alpha=0.5, beta=0.5))6. 实战案例 #
通过小练习帮助理解 random 的组合用法。
6.1 掷骰子小程序 #
# 说明:导入 random 模块以模拟掷骰子
import random
def dice_game() -> str:
# 说明:玩家1掷骰子
player1 = random.randint(1, 6)
# 说明:玩家2掷骰子
player2 = random.randint(1, 6)
print(f"玩家1掷出:{player1}")
print(f"玩家2掷出:{player2}")
# 说明:比较结果
if player1 > player2:
return "玩家1获胜"
if player2 > player1:
return "玩家2获胜"
return "平局"
print(dice_game())6.2 随机密码生成器 #
# 说明:导入 random 和 string 模块以生成密码
import random
import string
def generate_password(length: int = 12, use_special: bool = True) -> str:
# 说明:基础字符集包含字母和数字
chars = string.ascii_letters + string.digits
# 说明:根据参数是否添加特殊字符
if use_special:
chars += string.punctuation
# 说明:随机选择指定数量的字符
return "".join(random.choices(chars, k=length))
print("简单密码:", generate_password(8, False))
print("复杂密码:", generate_password(12, True))6.3 抽奖系统 #
# 说明:导入 random 模块以进行抽奖
import random
def lottery_draw(participants: list[str], prizes: list[str]) -> dict[str, str]:
# 说明:随机打乱参与者顺序
random.shuffle(participants)
results = {}
# 说明:逐个奖项匹配获奖者
for prize, person in zip(prizes, participants):
results[prize] = person
print(f"{prize} -> {person}")
return results
# 说明:调用抽奖函数
lottery_draw(
participants=["张三", "李四", "王五", "赵六", "钱七"],
prizes=["一等奖", "二等奖", "三等奖"],
)6.4 抛硬币统计 #
# 说明:导入 random 和 Counter 用于统计
import random
from collections import Counter
def coin_flip_simulation(times: int = 1000) -> Counter:
# 说明:模拟 times 次抛硬币
results = [random.choice(["正面", "反面"]) for _ in range(times)]
counter = Counter(results)
# 说明:输出统计结果
for side, count in counter.items():
percentage = count / times * 100
print(f"{side}: {count} 次 ({percentage:.1f}%)")
return counter
coin_flip_simulation()7. 进阶技巧与注意事项 #
7.1 固定随机种子 #
# 说明:导入 random 模块以设置种子
import random
# 说明:设置随机种子 42
random.seed(42)
# 说明:输出三次结果,确保可复现
for _ in range(3):
print(random.randint(1, 100))7.2 保存 / 恢复随机状态 #
# 说明:导入 random 模块以保存和恢复状态
import random
# 说明:保存当前状态
state = random.getstate()
# 说明:生成两个随机数
print("第一次:", random.randint(1, 100))
print("第二次:", random.randint(1, 100))
# 说明:恢复保存的状态
random.setstate(state)
# 说明:再次生成,结果和之前相同
print("恢复后第一次:", random.randint(1, 100))
print("恢复后第二次:", random.randint(1, 100))7.3 SystemRandom:更安全的随机 #
# 说明:导入 random 模块以使用 SystemRandom
import random
# 说明:SystemRandom 利用操作系统熵源
secure_random = random.SystemRandom()
print("安全随机整数:", secure_random.randint(1, 100))
print("安全随机选择:", secure_random.choice(["a", "b", "c"]))8. 常见问题 #
8.1 密码学安全? #
random 不适合生成密钥、验证码等安全场景,建议使用 secrets 模块:
# 说明:导入 secrets 以生成安全令牌
import secrets
# 说明:生成 16 字节(输出 32 个十六进制字符)的令牌
token = secrets.token_hex(16)
print("安全令牌:", token)8.2 性能技巧 #
大量生成随机数时应避免频繁循环调用:
# 说明:导入 random 模块以生成大批量随机数
import random
# 说明:逐个生成 1000 个整数(较慢)
slow = [random.randint(1, 100) for _ in range(1000)]
# 说明:一次性从范围中抽取 1000 个(较快)
fast = random.choices(range(1, 101), k=1000)8.3 范围边界容易混淆 #
# 说明:导入 random 模块以演示不同区间
import random
# 说明:random() 返回 [0.0, 1.0)
print(random.random())
# 说明:uniform 可能包含上限,视实现而定
print(random.uniform(1, 5))
# 说明:randint 包含两端
print(random.randint(1, 5))9. 总结 #
| 函数 | 描述 | 适用场景 |
| | | |
| random() | [0.0, 1.0) 浮点数 | 基础随机 |
| randint(a, b) | [a, b] 整数 | 骰子、抽奖 |
| uniform(a, b) | 浮点 | 连续数值采样 |
| choice/choices/sample | 序列操作 | 抽奖、抽样 |
| shuffle() | 打乱序列 | 洗牌、重排 |
| gauss() 等 | 概率分布 | 仿真、建模 |