random模块 - 详细说明

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

# 生成[0.0, 1.0)范围内的随机浮点数
print("随机浮点数:", random.random())

# 生成[1.0, 10.0]范围内的随机浮点数
print("1到10之间的随机浮点数:", random.uniform(1, 10))

# 生成[1, 6]范围内的随机整数(模拟骰子)
print("骰子点数:", random.randint(1, 6))

# 从0到10之间(不包括10)的偶数中随机选择一个
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))

# 有放回地随机选择3个元素(允许重复)
print("随机选择3个水果(可重复):", random.choices(fruits, k=3))

# 使用权重进行有放回选择
weights = [10, 5, 3, 2, 1] # 权重越高,被选中的概率越大
print("带权重的随机选择:", random.choices(fruits, weights=weights, k=3))

# 无放回地随机选择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])

# 可视化正态分布(需要安装matplotlib)
# plt.hist(normal_data, bins=30, density=True)
# plt.title('正态分布')
# plt.show()

# 模拟投掷两个骰子的和
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() # 不传递参数,使用系统时间

# 使用字符串作为种子
random.seed("hello")
print("\n使用字符串种子生成的随机数:")
print([random.randint(1, 10) for _ in range(5)])
提示: 在调试程序时,设置固定的随机种子可以确保每次运行程序时生成相同的随机序列,这对于重现问题和测试非常有用。

实际应用示例

random模块在实际编程中有广泛的应用,下面是一些常见的使用场景。

# 实际应用示例
import random

# 1. 生成随机密码
def generate_password(length=8):
    characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*"
    password = ''.join(random.choices(characters, k=length))
    return password

print("随机密码:", generate_password(12))

# 2. 抽奖程序
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))

# 3. 随机测验题目
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))

# 4. 模拟硬币投掷
def coin_toss(num_tosses=10):
    results = []
    for _ in range(num_tosses):
        result = random.choice(['正面', '反面'])
        results.append(result)
    return results

print("硬币投掷结果:", coin_toss(5))

# 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()函数时要注意,它会直接修改原序列,而不是返回一个新的打乱后的序列。如果需要保留原序列,可以先创建副本再进行打乱操作。
← 返回知识点列表