前言

有道题目这样的:

某次考试,需从题库中抽取一定数量题目,假设题库中共有 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中存放不重复数据 python不重复抽样_python

思考

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

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

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

还要做到不能重复

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

还是字典更适合些

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

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

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

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

所以写出了个for循环

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

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

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

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

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

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

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

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

python中存放不重复数据 python不重复抽样_for循环_02

python中存放不重复数据 python不重复抽样_python中存放不重复数据_03

两个使用方法还是很相近

结论

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

如果要求不能重复就用sample