前言
有道题目这样的:
某次考试,需从题库中抽取一定数量题目,假设题库中共有 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