栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

关于python随机抽取各类型不重复值的思考(sample与randint的区别)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于python随机抽取各类型不重复值的思考(sample与randint的区别)

前言

有道题目这样的:

某次考试,需从题库中抽取一定数量题目,假设题库中共有 1000 道题目,其中单选题 200 道,多选题 120 道,判断题 200 道, 填空题 400 道,简答题 80 道,现在需要随机抽出 25 道题,请给 出较合理的数据抽样方法,并编程实现,要求给出源代码(需有注释),并给出一次抽取结果。

如果这是道数学题就很简单,算一下各个题目占比是多少再乘随机抽出题目的个数25就行

但用python编程实现的话就会发现很多小技巧在里面

先把我的代码放上来

import random

dictsum = {'单选':200,	//各个类型题目各有多少道题
           '多选':120,
           '判断':200,
           '填空':400,
           '简答':800}

dict = {'单选':5,		//每个类型题目需要抽出多少道题
        '多选':3,
        '判断':5,
        '填空':10,
        '简答':2}

for name,sum in dictsum.items():	//循环dictsum字典获取信息

    print(name,':', random.sample(range(1, sum), dict[name]))
    //不重复的输出五种类型题目

输出结果是这样

思考

首先看下,因为题目背景是要出题

隐含的意思是:题目不能重复

所以这个时候不光要输出五种类型值

还要做到不能重复

我的想法一开始是建立两个数组,但是python里没有数组

还是字典更适合些

于是就建立了对应的字典来存储

dictsum对应所有题库的类型与值

dict对应的需要抽出的类型与值

为了得到题库里每个类型值需要对其进行遍历

所以写出了个for循环

sum对应这dictsum中总数目,即200,120、、、

name则对应dictsum中的题目类型,即单选,多选、、、

插一句
本来还想使用‘单选‘(dict)与’单选和’(dictsum)来区分两者
但是发现这样需要写两个for循环实在太不妥当
所以投机取巧的统一命名

random这个自然不用多少直接随机生成数,别忘记加上头文件

至于为什么使用random.sample()而不使用random.randint()

以下截取了开发者手册中的函数解释

randint更倾向于随机生成数,随机数中可能重复也可能不重复

sample只会进行无重复随机抽样

两个使用方法还是很相近

结论

如果题目只是要求随机产生就用randint

如果要求不能重复就用sample

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/299866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号