这 5 个 Python 随机数函数太强大了!

还在为生成随机数据发愁?别担心,5 个 Python 随机函数帮你轻松应对各种场景,让代码效率翻倍!不管是数据预处理还是算法测试,它们能覆盖 90% 的随机场景。不管你是新手写小游戏,还是进阶做数据模拟,掌握它们都能让代码更灵活。

一、列表打乱神器 shuffle

shuffle 函数能原地随机打乱列表元素,不需要返回新列表,特别适合数据混洗、随机排序等场景。比如进行随机分组、打乱题库顺序,只需一行代码就能让数据 “动起来”。

基本用法

使用时,需要先导入 random 模块,然后直接对列表使用 random.shuffle () 方法。

import random# 定义一个列表my_list = [1, 2, 3, 4, 5]# 打乱列表random.shuffle(my_list)# 打印打乱后的列表print(my_list)

运行上面的代码,每次输出的列表顺序都是随机的,比如可能是 [3, 1, 5, 2, 4],也可能是 [2, 5, 1, 4, 3] 等。

适用场景举例

  1. 随机分组:假设有一个班级的学生列表,要将他们随机分成几个小组,就可以先用 shuffle 打乱列表,再进行分组。
import randomstudents = ["张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十"]# 打乱学生列表random.shuffle(students)# 分成2个小组group1 = students[:4]group2 = students[4:]print("第一组:", group1)print("第二组:", group2)
  1. 打乱题库顺序:在制作在线考试系统时,为了避免考生作弊,可以用 shuffle 打乱题库的顺序。
import randomquestions = ["问题1", "问题2", "问题3", "问题4", "问题5"]# 打乱题库顺序random.shuffle(questions)print("打乱后的题库:", questions)

常见问题和错误

  1. 尝试对不可变序列使用 shuffle:shuffle 函数只能作用于列表这种可变序列,像元组、字符串这些不可变序列是不能使用的,否则会报错。
import randommy_tuple = (1, 2, 3, 4, 5)# 下面这行代码会报错random.shuffle(my_tuple)

运行后会出现 “TypeError: 'tuple' object does not support item assignment” 的错误。

  1. 误以为 shuffle 有返回值:很多新手会觉得 shuffle 会返回一个新的打乱后的列表,其实它是在原列表上进行修改,没有返回值。
import randommy_list = [1, 2, 3, 4, 5]# 错误的用法,以为new_list是打乱后的列表new_list = random.shuffle(my_list)print(new_list)  # 输出为None

面试相关问题及回答

问题 1:shuffle 函数有返回值吗?它是如何处理原列表的?

回答:shuffle 函数没有返回值,它会直接在原列表上进行修改,将列表元素随机打乱。

问题 2:能对元组使用 shuffle 函数吗?为什么?

回答:不能对元组使用 shuffle 函数。因为元组是不可变序列,而 shuffle 函数需要对序列进行修改操作,所以只能作用于可变的列表。

二、数值随机生成

在很多场景中,我们需要生成随机的数值,Python 的 random 模块提供了几个实用的函数来满足不同需求。

random () 函数

random () 函数能生成 0-1 之间的随机浮点数,适合概率计算、随机权重等场景。

基本用法
import random# 生成0-1之间的随机浮点数num = random.random()print(num)

运行后会输出一个像 0.3456789 这样在 0 到 1 之间的浮点数。

适用场景举例
  1. 概率计算:比如模拟掷硬币,正面朝上的概率为 0.5,我们可以生成一个 0-1 的随机数,如果小于 0.5 则认为正面朝上,否则反面朝上。
import random# 模拟掷硬币if random.random() < 0.5:print("正面朝上")else:print("反面朝上")
  1. 随机权重:在一些推荐系统中,给不同的物品分配随机权重,然后根据权重进行推荐。
import randomitems = ["物品A", "物品B", "物品C"]# 生成随机权重weights = [random.random() for _ in items]print("物品及对应权重:", list(zip(items, weights)))

randint (a, b) 函数

randint (a, b) 能精准生成 [a, b] 范围内的整数,在游戏得分、随机阈值设定等场景中很常用。

基本用法
import random# 生成1到10之间的随机整数num = random.randint(1, 10)print(num)

运行后会输出 1 到 10 之间的任意一个整数,包括 1 和 10。

适用场景举例
  1. 游戏得分:在一些小游戏中,随机生成玩家的得分。
import random# 生成50到100之间的游戏得分score = random.randint(50, 100)print("你的游戏得分是:", score)
  1. 随机阈值设定:在程序中需要设定一个随机的阈值,当某个值超过该阈值时执行特定操作。
import random# 设定10到20之间的随机阈值threshold = random.randint(10, 20)value = 15if value > threshold:print("执行操作A")else:print("执行操作B")

randrange (start, stop, step) 函数

randrange (start, stop, step) 支持步长跳跃生成随机数,比如可以生成奇偶随机数,在很多需要特定间隔数值的场景中很有用。

基本用法
import random# 生成1到10之间,步长为2的随机数(即1,3,5,7,9中的一个)num = random.randrange(1, 10, 2)print(num)
适用场景举例
  1. 生成奇偶随机数:生成随机的奇数或偶数。
import random# 生成1到20之间的随机奇数odd_num = random.randrange(1, 21, 2)print("随机奇数:", odd_num)# 生成2到20之间的随机偶数even_num = random.randrange(2, 21, 2)print("随机偶数:", even_num)
  1. 按特定间隔生成随机数:比如在生成时间间隔、价格区间等场景中。
import random# 生成10到100之间,间隔为5的随机价格price = random.randrange(10, 101, 5)print("随机价格:", price)

三个函数对比表格

函数 功能 返回值类型 范围 适用场景
random() 生成 0-1 的随机数 浮点数 [0,1) 概率计算、随机权重
randint(a,b) 生成 [a,b] 内的整数 整数 [a,b] 游戏得分、随机阈值设定
randrange(start,stop,step) 按步长生成随机数 整数 [start,stop),步长为 step 生成奇偶随机数等特定间隔数值

常见问题和错误

  1. 对 randint 函数的范围理解错误:有些新手会以为 randint (a,b) 生成的是 [a,b) 范围内的整数,其实它是包括 b 的。
import random# 可能会输出10num = random.randint(5, 10)print(num)
  1. 在 randrange 函数中不注意步长导致结果不符合预期:比如想生成偶数,却把步长设为 1。
import random# 这样可能会生成奇数num = random.randrange(2, 10, 1)print(num)

面试相关问题及回答

问题 1:random () 函数生成的随机数范围是多少?

回答:random () 函数生成的随机数范围是 [0,1),即大于等于 0,小于 1 的浮点数。

问题 2:randint (a,b) 和 randrange (a,b) 有什么区别?

回答:randint (a,b) 生成的是 [a,b] 范围内的整数,包括 b;而 randrange (a,b) 生成的是 [a,b) 范围内的整数,不包括 b。另外,randrange 还可以指定步长,而 randint 不能。

三、元素随机选择

当我们需要从序列中随机选择元素时,Python 的 random 模块也提供了相应的函数。

choice (iterable) 函数

choice (iterable) 函数能从序列中挑选一个元素,在抽选随机用户、生成随机文案等场景中非常方便。

基本用法
import random# 从列表中随机选择一个元素fruits = ["苹果", "香蕉", "橙子", "葡萄"]selected_fruit = random.choice(fruits)print("选中的水果:", selected_fruit)
适用场景举例
  1. 抽选随机用户:从用户列表中随机抽取一个幸运用户。
import randomusers = ["user1", "user2", "user3", "user4", "user5"]lucky_user = random.choice(users)print("幸运用户是:", lucky_user)
  1. 生成随机文案:在一些宣传场景中,从预设的文案中随机选择一条进行展示。
import randomcopywritings = ["优惠多多,快来抢购!", "新品上市,欢迎选购!", "限时折扣,不容错过!"]selected_copy = random.choice(copywritings)print("展示的文案:", selected_copy)

choices (iterable, k=5, weights=()) 函数

choices (iterable, k=5, weights=()) 函数能按权重选多个元素,支持重复选取,在模拟抽奖、概率事件等场景中能轻松实现需求。

基本用法
import random# 从列表中按权重随机选择3个元素,可重复colors = ["红", "黄", "蓝"]# 权重分别为3,2,1,即红色被选中的概率更高selected_colors = random.choices(colors, weights=[3, 2, 1], k=3)print("选中的颜色:", selected_colors)
适用场景举例
  1. 模拟抽奖:设置不同奖项的权重,进行多次抽奖。
import randomprizes = ["一等奖", "二等奖", "三等奖", "谢谢参与"]# 权重越高,被抽中的概率越大weights = [1, 3, 5, 10]# 抽5次奖lottery_results = random.choices(prizes, weights=weights, k=5)print("抽奖结果:", lottery_results)
  1. 模拟概率事件:比如模拟天气情况,晴天、阴天、雨天的概率不同。
import randomweathers = ["晴天", "阴天", "雨天"]weights = [0.6, 0.3, 0.1]# 模拟未来7天的天气future_weathers = random.choices(weathers, weights=weights, k=7)print("未来7天天气:", future_weathers)

sample (iterable, k) 函数

sample 函数能从序列中抽取不重复的元素,在生成随机不重复测试数据、随机样本分析等场景中很有用,能避免重复值干扰,让数据处理更严谨。

基本用法
import random# 从列表中随机抽取2个不重复的元素numbers = [10, 20, 30, 40, 50]selected_numbers = random.sample(numbers, k=2)print("选中的数字:", selected_numbers)
适用场景举例
  1. 生成随机不重复测试数据:在软件测试中,从大量数据中抽取不重复的测试数据。
import random# 假设有100个用户ID,从中抽取10个不重复的进行测试user_ids = [i for i in range(1, 101)]test_ids = random.sample(user_ids, k=10)print("测试用户ID:", test_ids)
  1. 随机样本分析:从总体中抽取不重复的样本进行分析。
import random# 从50个产品中抽取5个不重复的样本进行质量检测products = [f"产品{i}" for i in range(1, 51)]samples = random.sample(products, k=5)print("检测样本:", samples)

三个函数对比表格

函数 功能 是否允许重复选取 是否支持权重 适用场景
choice(iterable) 从序列中选一个元素 不涉及重复问题 不支持 抽选随机用户、生成随机文案
choices(iterable, k=5, weights=()) 按权重选多个元素 支持重复选取 支持 模拟抽奖、概率事件
sample(iterable, k) 抽取不重复元素 不支持重复选取 不支持 生成随机不重复测试数据、随机样本分析

常见问题和错误

  1. 使用 sample 函数时 k 值大于序列长度:当 k 的值大于序列中元素的个数时,会报错。
import randomnumbers = [1, 2, 3]# 下面这行代码会报错,因为k=4大于列表长度3selected = random.sample(numbers, k=4)

运行后会出现 “ValueError: Sample larger than population or is negative” 的错误。

  1. 对 choices 函数的权重参数使用错误:权重参数的长度必须和序列的长度一致,否则会报错。
import randomfruits = ["苹果", "香蕉", "橙子"]# 下面这行代码会报错,因为权重列表长度为2,和水果列表长度3不一致selected = random.choices(fruits, weights=[1, 2], k=2)

面试相关问题及回答

问题 1:choice 和 choices 函数有什么区别?

回答:choice 函数从序列中选择一个元素,而 choices 函数可以选择多个元素,并且可以指定权重,还支持重复选取。

问题 2:在什么情况下使用 sample 函数而不是 choices 函数?

回答:当需要从序列中抽取不重复的元素时,使用 sample 函数;如果允许重复选取,或者需要按权重选取多个元素,则使用 choices 函数。

四、随机结果固定 seed

seed 函数通过种子值可以复现随机结果,在测试时固定随机输入,能快速定位问题;还能生成指定随机序列,确保程序在相同 “随机” 条件下运行,让调试更高效。

基本用法

import random# 设置种子值random.seed(10)# 生成随机数print(random.random())  # 输出0.5714025946899135# 再次设置相同的种子值random.seed(10)# 生成的随机数和上次相同print(random.random())  # 输出0.5714025946899135

适用场景举例

  1. 测试时固定随机输入:在程序测试过程中,为了保证每次测试的随机输入相同,方便对比测试结果。
import random# 设置种子值,保证每次运行测试时输入的随机数相同random.seed(5)test_data = [random.randint(1, 100) for _ in range(5)]print("测试数据:", test_data)# 进行测试操作...
  1. 调试程序:当程序因随机因素出现问题时,设置种子值可以复现问题场景,方便调试。
import random# 出现问题时的种子值random.seed(8)# 复现问题时的随机操作# ...

常见问题和错误

  1. 认为 seed 值设置后只对一个随机函数有效:其实 seed 值设置后,会影响之后所有的随机函数调用,直到再次设置 seed 值。
import randomrandom.seed(3)print(random.randint(1, 10))  # 输出3print(random.randint(1, 10))  # 输出10random.seed(3)print(random.randint(1, 10))  # 再次输出3
  1. 在多线程环境中使用 seed 函数导致结果不符合预期:在多线程中,seed 函数的作用可能会相互干扰,导致随机结果不稳定。

面试相关问题及回答

问题 1:seed 函数的作用是什么?

回答:seed 函数用于设置随机数生成器的种子,当种子值相同时,生成的随机序列是相同的,这样可以复现随机结果,方便测试和调试。

问题 2:如果不调用 seed 函数,Python 的随机数生成器会如何初始化?

回答:如果不调用 seed 函数,Python 的随机数生成器会使用系统时间作为默认的种子值,因此每次运行程序生成的随机数序列都是不同的。

总结

这 5 个 Python 随机数函数各有特色,shuffle 能打乱列表,random、randint、randrange 可生成不同类型和范围的随机数,choice、choices、sample 用于元素的随机选择,seed 则能固定随机结果。掌握它们的用法,能让你在处理随机数据相关的任务时更加得心应手,无论是新手还是进阶开发者,都能从中受益。