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.7365

2. 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模块 secrets模块
随机数类型 伪随机数 密码学安全随机数
适用场景 游戏、模拟、抽样 密码、令牌、密钥
可预测性 设置种子后可预测 不可预测
性能 较快 较慢

八、课程小结

  • 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 模块,它基于操作系统提供的密码学安全随机源。

标签: random随机数 随机整数 随机选择 随机洗牌 Python标准库 随机密码

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python标准库math详解 下一篇: Python标准库datetime使用

poll相关推荐