Python五种“随机抽奖”方法
作者:牟晓东
来源:《电脑报》2021年第16期
        “随机抽奖”例题:假设要从10000个人中随机抽取出10人作为“中奖者”,每人對应一个0-9999中的整数,要求使用Python编程按从小到大的顺序输出中奖者数字代号。类似的“随机抽奖”程序一般均需要先导入random(随机)模块,然后借助其中的randint()、shuffle()和sample()等函数进行随机数的选取,最后使用列表或集合对数据进行存储、排序和输出。
        首先,通过“import random”导入random模块(下同);接着,建立空列表“my_list1 = []”;建立while循环结构,判断条件为“len(my_list1) <= 10”,即列表my_list1中元素的个数达到10为止(通过len()检测列表的长度);在循环体中,第一条语句为“x = random.randint(0,9999)”,变量x取值为0-9999中的随机某个整数(包括0和9999);条件判断语句“if x not in my_list1”的作用是,查看生成的随机数x是否在列表my_list1中,防止多次生成的随机数中有重复值出现;如果不重复,则使用append()方法将x追加到列表my_list1中:“my_list1.append
(x)”;当循环结束时,列表my_list1中就会保存有10个0-9999间的不重复数据。最后,通过sorted()函数对列表my_list1进行默认参数排序(升序):“my_list2 = sorted(my_list1)”,得到的列表my_list2就是从小到大顺序中奖号码,再使用print()输出结果即可。
        运行程序,得到了10个“中奖”号码(如图1)。
sortedlist
        与法1类似,只不过是使用集合而非列表来存储生成的随机数:“my_set = set()”,建立一个空集合;接着,仍然是在while循环中,通过randint生成0-9999间的某随机数,将它追
加到集合my_set中。由于集合中的元素是不可能存在重复数据的,因此不必像法1中的列表元素进行in成员运算判断,相当于直接进行了“去重”操作。循环结束后,仍然是使用sorted()函数进行排序并保存至列表my_list中,进行print打印输出(如图2)。
        首先建立列表my_list1,其值为“list(range(10000))”,通过list()将0至9999共10000个数据保存至列表my_list1中;接着使用random中的shuffle(),将列表my_list1中的数据进行随机排序:“random.shuffle(my_list1)”;然后对列表my_list1进行切片操作,任意截取出10个数据,比如“my_list1[:10]”是指从索引的第0个切至第9个(当然也可以使用“my_list2 = my_list1[99:109]”,意思是从第99个切至第109个),将它们存入列表my_list2中;仍然是使用sorted()函数进行排序并保存至第3个列表my_list3中,进行print打
印输出(如图3)。
        Random中的sample()功能是从序列中随机多个“取样”。首先建立列表my_list1,其值为从0-9999中随机抽取10个不重复的数据:“my_list1 = random.sample(range(10000),10)”;然后就可以使用sorted()函数进行排序,将结果保存至列表my_list2中,最后进行print打印输出(如图4)。
        numpy中有个random.choice(),可以随机从指定列表中提取若干个元素。首先,通过“import numpy as np”导入numpy;接着建立列表my_list1,存储的数据是0-9999共10000个数据:“my_list1 = list(range(10000))”;建立列表my_list2,值为从列表my_list1中随机提取10个不重复的数据:“my_list2 = np.random.choice(my_list1,10,replace=False)”,其中的参数“replace=False”即为控制随机数“不重复”。最后,使用sorted()函数进行排序并保存至第3个列表my_list3中,进行print打印输出即可(如图5)。
        小结:抽奖就是获取不重复的随机数的问题,要解决这个问题Python有多种函数和算法可以选择,体会其中的区别后你可以合理运用在其他实际应用中。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。