Python的random模块提供了生成伪随机数的功能,广泛应用于游戏开发、模拟、密码学、数据分析等领域。需要注意的是,random模块生成的是伪随机数,它们是通过确定性算法生成的,而不是真正的随机数。
random模块概览
Python的random模块具有以下特点:
- 伪随机数生成:基于确定性算法生成看似随机的数字序列
- 多种分布支持:支持均匀分布、正态分布等多种随机分布
- 序列操作:提供随机选择、随机打乱等序列操作功能
- 可重现性:通过设置随机种子可以重现随机序列
基本随机数生成
random模块提供了多种生成随机数的方法,包括生成随机浮点数和整数。
| 函数 |
描述 |
示例 |
结果范围 |
| random() |
生成[0.0, 1.0)范围内的随机浮点数 |
random.random() |
[0.0, 1.0) |
| uniform(a, b) |
生成[a, b]范围内的随机浮点数 |
random.uniform(1, 10) |
[1.0, 10.0] |
| randint(a, b) |
生成[a, b]范围内的随机整数 |
random.randint(1, 6) |
[1, 6] |
| randrange(start, stop, step) |
从range(start, stop, step)中随机选择一个元素 |
random.randrange(0, 10, 2) |
0, 2, 4, 6, 8 |
import random
print("随机浮点数:", random.random())
print("1到10之间的随机浮点数:", random.uniform(1, 10))
print("骰子点数:", random.randint(1, 6))
print("随机偶数:", random.randrange(0, 10, 2))
print("5个随机浮点数:", [random.random() for _ in range(5)])
print("5个随机整数:", [random.randint(1, 100) for _ in range(5)])
序列操作
random模块提供了多种操作序列的方法,包括随机选择元素和随机打乱序列。
| 函数 |
描述 |
示例 |
结果 |
| choice(seq) |
从非空序列中随机选择一个元素 |
random.choice(['a','b','c']) |
'a', 'b'或'c' |
| choices(seq, weights, k) |
从序列中有放回地随机选择k个元素 |
random.choices(['a','b','c'], k=2) |
['a','c'] |
| sample(seq, k) |
从序列中无放回地随机选择k个唯一元素 |
random.sample(['a','b','c'], 2) |
['a','b'] |
| shuffle(seq) |
将序列随机打乱(原地操作) |
random.shuffle(['a','b','c']) |
['b','a','c'] |
import random
fruits = ['苹果', '香蕉', '橙子', '葡萄', '西瓜']
print("随机水果:", random.choice(fruits))
print("随机选择3个水果(可重复):", random.choices(fruits, k=3))
weights = [10, 5, 3, 2, 1]
print("带权重的随机选择:", random.choices(fruits, weights=weights, k=3))
print("随机选择3个唯一水果:", random.sample(fruits, 3))
cards = ['红桃A', '黑桃K', '方块Q', '梅花J']
print("原始牌序:", cards)
random.shuffle(cards)
print("洗牌后:", cards)
word = "Python"
print("随机字母:", random.choice(word))
随机分布
random模块支持多种概率分布,可以生成符合特定分布的随机数。
| 函数 |
描述 |
分布类型 |
参数 |
| gauss(mu, sigma) |
生成符合高斯分布(正态分布)的随机数 |
正态分布 |
mu: 均值, sigma: 标准差 |
| normalvariate(mu, sigma) |
生成符合正态分布的随机数 |
正态分布 |
mu: 均值, sigma: 标准差 |
| expovariate(lambd) |
生成符合指数分布的随机数 |
指数分布 |
lambd: 率参数 |
| betavariate(alpha, beta) |
生成符合Beta分布的随机数 |
Beta分布 |
alpha, beta: 形状参数 |
| gammavariate(alpha, beta) |
生成符合Gamma分布的随机数 |
Gamma分布 |
alpha, beta: 形状参数 |
import random
import matplotlib.pyplot as plt
mu, sigma = 0, 1
normal_data = [random.gauss(mu, sigma) for _ in range(1000)]
print("正态分布样本(前10个):", normal_data[:10])
lambd = 1.0
exp_data = [random.expovariate(lambd) for _ in range(100)]
print("指数分布样本(前10个):", exp_data[:10])
dice_sums = [random.randint(1, 6) + random.randint(1, 6) for _ in range(1000)]
print("两个骰子和的样本(前10个):", dice_sums[:10])
随机种子
通过设置随机种子,可以重现随机序列,这在调试和测试中非常有用。
import random
random.seed(42)
print("使用种子42生成的随机数:")
for i in range(5):
print(random.random())
random.seed(42)
print("\n重置种子后生成的相同随机数:")
for i in range(5):
print(random.random())
random.seed("hello")
print("\n使用字符串种子生成的随机数:")
print([random.randint(1, 10) for _ in range(5)])
提示: 在调试程序时,设置固定的随机种子可以确保每次运行程序时生成相同的随机序列,这对于重现问题和测试非常有用。
实际应用示例
random模块在实际编程中有广泛的应用,下面是一些常见的使用场景。
import random
def generate_password(length=8):
characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
password = ''.join(random.choices(characters, k=length))
return password
print("随机密码:", generate_password(12))
def lottery_draw(participants, winners_count=3):
if len(participants) < winners_count:
return "参与者数量不足"
winners = random.sample(participants, winners_count)
return winners
participants = ["张三", "李四", "王五", "赵六", "钱七"]
print("中奖者:", lottery_draw(participants))
def random_quiz(questions, num_questions=5):
selected_questions = random.sample(questions, min(num_questions, len(questions)))
random.shuffle(selected_questions)
return selected_questions
questions = ["问题1", "问题2", "问题3", "问题4", "问题5", "问题6", "问题7"]
print("随机测验题目:", random_quiz(questions, 3))
def coin_toss(num_tosses=10):
results = []
for _ in range(num_tosses):
result = random.choice(['正面', '反面'])
results.append(result)
return results
print("硬币投掷结果:", coin_toss(5))
def random_color():
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return f"rgb({r}, {g}, {b})"
print("随机颜色:", random_color())
注意: random模块生成的是伪随机数,不适合用于加密或安全相关的应用。对于加密用途,请使用secrets模块,它提供了生成加密安全随机数的功能。
提示: 在使用random.shuffle()函数时要注意,它会直接修改原序列,而不是返回一个新的打乱后的序列。如果需要保留原序列,可以先创建副本再进行打乱操作。