Python3 random 模块及应用

🎉摘要:本文详细介绍 Python 内置 random 模块,涵盖伪随机数概念、常用方法如 randint、choice、shuffle 及 seed 设置。提供生成验证码、抽奖、打乱顺序等实战代码示例,帮助开发者掌握随机数生成与序列操作技巧。

在 Python 中,random 是内置的伪随机数模块,主要用于生成随机数、随机选择元素、随机打乱顺序、随机采样等,广泛用于游戏、测试、验证码、抽奖、数据随机化等场景。

random 模块生成的是伪随机数支持数字、列表、字符串等多种数据类型。

什么是伪随机数?

伪随机数是指由计算机程序通过特定算法、数学公式或预设逻辑生成的数值序列,这类数字表面上呈现出无规律、不可预测的随机特征,但本质上并非真正意义上的随机数。

与自然界中如粒子运动、环境噪声这类完全不可预知、无固定规律的真随机现象不同,伪随机数的产生过程具备可复现性,只要初始种子值与算法保持一致,就能生成完全相同的数字序列。

伪随机数广泛应用于日常编程、密码学基础应用、模拟测试、游戏数值生成等场景,是计算机系统中实现随机效果的核心方式之一。

常用方法

基础随机数生成

random.random()

生成 [0.0, 1.0) 之间的随机浮点数(包含 0,不包含 1),示例:

import random

# 生成 0~1 之间的随机浮点数
num = random.random()
print("随机浮点数:", num)

运行结果:

随机浮点数: 0.15919151657706765

random.uniform(a, b)

生成 [a, b] 之间的随机浮点数(a、b 可互换大小),示例:

import random

# 生成 1~5 之间的随机浮点数
num = random.uniform(1, 5)
print("1~5随机浮点数:", num)

运行结果:

1~5随机浮点数: 1.4465055587094855

random.randint(a, b)

生成 [a, b] 之间的随机整数(包含 a 和 b,必须 a≤b)。该方法非常实用,适合生成验证码、随机年龄、随机编号等。不需要像 uniform() 方法生成的随机数还需要转换成整数。例如:

import random

# 生成 1~10 之间的随机整数
num = random.randint(1, 10)
print("1~10随机整数:", num)

运行结果:

1~10随机整数: 10

random.randrange(start, stop, step)

按指定步长生成随机整数(不包含 stop),等价于从 range(start, stop, step) 中随机选一个数。例如:

import random

# 生成 0~10 之间的偶数(步长2)
num = random.randrange(0, 10, 2)
print("0~10随机偶数:", num)  # 输出:0/2/4/6/8

# 简写:只传结束值,默认从0开始
num = random.randrange(5)
print("0~4随机整数:", num)  # 输出:0-4任意数

运行结果:

0~10随机偶数: 6
0~4随机整数: 4

序列操作

random.choice(seq)

从非空序列中随机选择 1 个元素,适合列表、字符串、元组。例如:

import random

# 列表随机选1个
lst = ["苹果", "香蕉", "橙子", "葡萄"]
res = random.choice(lst)
print("随机水果:", res)

# 字符串随机选1个字符
s = "abcdefg"
res = random.choice(s)
print("随机字符:", res)

运行结果:

随机水果: 苹果
随机字符: b

random.choices(seq, weights=None, k=1)

随机选择多个元素(可重复),参数 weights 表示权重(概率),k 表示选取数量。例如:

import random

lst = ["一等奖", "二等奖", "三等奖", "谢谢参与"]
# 随机选2个(可重复)
res = random.choices(lst, k=2)
print("随机选2个:", res)

# 带权重(概率):一等奖概率1,二等奖2,三等奖3,谢谢参与10
res = random.choices(lst, weights=[1,2,3,10], k=1)
print("加权随机:", res)

运行结果:

随机选2个: ['一等奖', '二等奖']
加权随机: ['谢谢参与']

random.sample(seq, k)

随机选择 k 个不重复的元素(无重复采样),要求 k ≤ 序列长度。例如:

import random

lst = [1,2,3,4,5,6,7,8,9,10]
# 随机选3个不重复的数字
res = random.sample(lst, 3)
print("随机3个不重复数:", res)

运行结果:

随机3个不重复数: [7, 8, 10]

random.shuffle(x)

随机打乱序列顺序(原地修改,无返回值),注意,仅适用于可变序列(列表)。例如:

import random

lst = [1,2,3,4,5]
# 打乱顺序
random.shuffle(lst)
print("打乱后列表:", lst)

运行结果:

打乱后列表: [2, 1, 5, 3, 4]

高级用法

random.seed(a)

设置随机种子,让随机结果固定(可复现),注意,相同种子,生成的随机数完全一样。例如:

import random

# 设置种子为 10
random.seed(10)
print(random.randint(1,100))

# 再次设置相同种子,结果不变
random.seed(10)
print(random.randint(1,100))

运行结果:

74
74

实战:多功能随机工具

该示例包含功能如下:

  1. 生成 4 位数字验证码

  2. 随机抽取 3 名中奖员工

  3. 随机打乱游戏顺序

  4. 生成 10 个 1~100 不重复随机数

完整代码:

import random

def random_tool():
    # 1. 生成4位数字验证码
    code = random.randint(1000, 9999)
    print(f"1. 4位验证码:{code}")

    # 2. 员工抽奖(不重复抽取3人)
    employees = ["张三", "李四", "王五", "赵六", "钱七", "孙八", "周九"]
    winners = random.sample(employees, 3)
    print(f"2. 中奖员工:{winners}")

    # 3. 随机打乱游戏关卡顺序
    levels = ["关卡1", "关卡2", "关卡3", "关卡4", "关卡5"]
    random.shuffle(levels)
    print(f"3. 打乱后关卡:{levels}")

    # 4. 生成10个 1~100 不重复随机数
    random_nums = random.sample(range(1, 101), 10)
    print(f"4. 10个不重复随机数:{random_nums}")

# 执行工具
if __name__ == "__main__":
    random_tool()

运行结果:

1. 4位验证码:9986
2. 中奖员工:['孙八', '王五', '李四']
3. 打乱后关卡:['关卡3', '关卡2', '关卡4', '关卡5', '关卡1']
4. 10个不重复随机数:[98, 48, 80, 61, 94, 37, 12, 22, 90, 74]

更多关于 random 模块的用法请参考 https://docs.python.org/3/library/random.html 官方手册。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号