pin_drop当前位置:知识文库 ❯ 图文
Python标准库random
一、random模块概述
random 是Python内置的标准库,用于生成各种类型的随机数。它基于 Mersenne Twister(梅森旋转算法)实现,可以产生高质量的伪随机数序列。
random模块广泛应用于游戏开发、模拟实验、数据采样、密码生成、抽奖系统等场景。本教程将详细介绍其核心函数的用法和实际应用场景。
代码示例
import random
# random模块常用函数一览
# random.random() - 生成[0.0, 1.0)之间的随机浮点数
# random.randint(a, b) - 生成[a, b]之间的随机整数
# random.choice(seq) - 从序列中随机选择一个元素
# random.shuffle(lst) - 原地打乱列表顺序
# random.sample(pop, k) - 从总体中随机抽取k个不重复样本
# random.uniform(a, b) - 生成[a, b]之间的随机浮点数二、生成随机整数
1. randint() — 指定范围的随机整数
代码示例
import random
# randint(a, b):生成 [a, b] 范围内的随机整数(包含a和b)
print(random.randint(1, 10)) # 例如: 7
print(random.randint(1, 10)) # 例如: 3
print(random.randint(-5, 5)) # 例如: -2
# 模拟掷骰子
for i in range(5):
dice = random.randint(1, 6)
print(f"第{i+1}次掷骰子: {dice}")2. randrange() — 带步长的随机整数
代码示例
import random
# randrange(start, stop[, step]):类似range(),从指定范围内随机选取
print(random.randrange(0, 100, 10)) # 从 [0, 10, 20, ..., 90] 中随机选
print(random.randrange(1, 10, 2)) # 从 [1, 3, 5, 7, 9] 中随机选
# 生成0到100之间的随机偶数
print(random.randrange(0, 101, 2)) # 例如: 42三、生成随机浮点数
1. random() — 基础随机浮点数
代码示例
import random
# random():生成 [0.0, 1.0) 之间的随机浮点数
for i in range(5):
print(f"随机数: {random.random():.4f}")
# 输出示例:
# 随机数: 0.6394
# 随机数: 0.0250
# 随机数: 0.2750
# 随机数: 0.2232
# 随机数: 0.73652. uniform() — 指定范围的随机浮点数
代码示例
import random
# uniform(a, b):生成 [a, b] 之间的随机浮点数
print(random.uniform(1.0, 10.0)) # 例如: 5.6723
# 生成随机温度值(20.0 ~ 35.0)
for day in range(1, 6):
temp = random.uniform(20.0, 35.0)
print(f"第{day}天温度: {temp:.1f}°C")
# 生成随机百分比
score = random.uniform(0, 100)
print(f"随机得分: {score:.2f}")3. 其他分布
代码示例
import random
# 正态分布(均值=0, 标准差=1)
print(f"正态分布: {random.gauss(0, 1):.4f}")
# 三角分布
print(f"三角分布: {random.triangular(0, 10, 5):.4f}")
# 贝塔分布
print(f"贝塔分布: {random.betavariate(2, 5):.4f}")四、随机选择与抽样
1. choice() — 从序列中随机选择一个元素
代码示例
import random
# 从列表中随机选择一个
fruits = ['苹果', '香蕉', '橙子', '葡萄', '西瓜']
print(f"今天吃: {random.choice(fruits)}")
# 随机选择一个方向
directions = ['上', '下', '左', '右']
print(f"随机方向: {random.choice(directions)}")
# 加权选择(Python 3.6+)
# choices() 支持权重参数
colors = ['红色', '蓝色', '绿色', '黄色']
weights = [10, 30, 40, 20] # 权重
results = random.choices(colors, weights=weights, k=10)
print(f"加权随机选择10次: {results}")2. sample() — 不重复随机抽样
代码示例
import random
# sample(population, k):从总体中随机抽取k个不重复的样本
students = ['小明', '小红', '小刚', '小丽', '小强', '小美', '小华', '小芳']
# 随机抽取3名幸运同学
winners = random.sample(students, 3)
print(f"中奖者: {winners}")
# 从数字范围中抽样
lottery = random.sample(range(1, 34), 6)
lottery.sort()
print(f"双色球号码: {lottery}")
# 注意:sample不会修改原列表
print(f"原列表不变: {students}")五、随机洗牌
1. shuffle() — 原地打乱列表
代码示例
import random
# shuffle():原地打乱列表顺序(修改原列表,返回None)
cards = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
print(f"洗牌前: {cards}")
random.shuffle(cards)
print(f"洗牌后: {cards}")
# 注意:shuffle只适用于可变序列(如list),不能用于tuple或str
numbers = list(range(1, 11))
random.shuffle(numbers)
print(f"数字洗牌: {numbers}")2. 不修改原列表的打乱方式
代码示例
import random
# 方法1:使用sample()
original = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
shuffled = random.sample(original, len(original))
print(f"原列表: {original}")
print(f"打乱后: {shuffled}")
# 方法2:使用sorted()配合random
shuffled2 = sorted(original, key=lambda x: random.random())
print(f"打乱后2: {shuffled2}")六、实战案例
案例1:生成随机密码
代码示例
import random
import string
def generate_password(length=12):
"""生成包含大小写字母、数字和特殊字符的随机密码"""
chars = string.ascii_letters + string.digits + '!@#$%^&*'
password = ''.join(random.choice(chars) for _ in range(length))
return password
# 生成不同长度的密码
for length in [8, 12, 16]:
print(f"{length}位密码: {generate_password(length)}")案例2:模拟掷骰子游戏
代码示例
import random
def roll_dice():
"""模拟掷两个骰子"""
return random.randint(1, 6) + random.randint(1, 6)
# 模拟1000次掷骰子,统计各点数出现次数
results = {}
for _ in range(1000):
total = roll_dice()
results[total] = results.get(total, 0) + 1
# 输出统计结果
print("点数\t次数\t频率")
for total in sorted(results):
freq = results[total] / 1000 * 100
bar = '█' * (results[total] // 10)
print(f"{total:>2}\t{results[total]:>3}\t{freq:.1f}%\t{bar}")案例3:随机点名系统
代码示例
import random
class RandomPicker:
"""随机点名器"""
def __init__(self, names):
self.names = list(names)
self.called = []
def pick_one(self):
"""随机选一个人"""
if not self.names:
return "所有人都已被点过!"
name = random.choice(self.names)
return name
def pick_unique(self):
"""不重复随机选一个人"""
if not self.names:
return "所有人都已被点过!"
name = random.choice(self.names)
self.names.remove(name)
self.called.append(name)
return name
def reset(self):
"""重置"""
self.names = list(self.names) + list(self.called)
self.called = []
students = ['张三', '李四', '王五', '赵六', '孙七', '周八']
picker = RandomPicker(students)
for i in range(4):
print(f"第{i+1}位: {picker.pick_unique()}")
print(f"已点名: {picker.called}")
print(f"未点名: {picker.names}")七、注意事项与最佳实践
注意1:伪随机数的安全性:random模块生成的是伪随机数,不适用于密码学、安全令牌等场景。需要安全随机数时请使用
secrets模块。
注意2:随机种子的作用:使用
random.seed()可以设置随机种子,使随机序列可复现。这在调试和测试中非常有用。
代码示例
import random
# 设置随机种子,使结果可复现
random.seed(42)
print(random.randint(1, 100)) # 始终输出相同的值
# 再次设置相同种子
random.seed(42)
print(random.randint(1, 100)) # 输出与上面相同
# 安全随机数(用于密码、令牌等)
import secrets
secure_token = secrets.token_hex(16)
print(f"安全令牌: {secure_token}")
secure_int = secrets.randbelow(100)
print(f"安全随机整数: {secure_int}")八、课程小结
-
random.randint(a, b):生成指定范围内的随机整数,包含两端
-
random.random():生成 [0.0, 1.0) 之间的随机浮点数
-
random.choice(seq):从序列中随机选择一个元素
-
random.shuffle(lst):原地打乱列表顺序
-
random.sample(pop, k):不重复随机抽样k个元素
-
安全性:需要密码学安全随机数时使用 secrets 模块
练习1
编写一个"猜数字"小游戏:程序随机生成1到100之间的整数,用户通过输入猜测,程序提示"大了"或"小了",直到猜中为止。统计猜测次数。
练习2
编写一个函数 generate_random_matrix(rows, cols, min_val, max_val),生成指定大小的随机整数矩阵(二维列表),并打印输出。
常见问题
random.randint(1,10) 和 random.randrange(1,10) 有什么区别?
randint(1, 10) 的范围是 [1, 10],包含10;而 randrange(1, 10) 的范围是 [1, 10),不包含10,等价于 randrange(1, 10, 1)。
如何让随机数可复现?
使用 random.seed(固定值) 设置随机种子。设置相同种子后,后续生成的随机数序列完全相同。这在单元测试和调试中非常有用。
choice() 和 choices() 有什么区别?
choice() 只返回一个随机元素;choices()(Python 3.6+)可以返回多个元素,支持有放回抽样,并且可以通过 weights 参数设置权重。
shuffle() 和 sample() 有什么区别?
shuffle() 是原地打乱列表,会修改原列表;sample(pop, len(pop)) 返回一个新列表,不修改原列表。如果需要保持原列表不变,推荐使用 sample。
random模块能用于生成密码吗?
不建议。random生成的是伪随机数,理论上可以被预测。生成密码、安全令牌等应使用 secrets 模块,它基于操作系统提供的密码学安全随机源。
本文涉及AI创作
内容由AI创作,请仔细甄别