打开网易新闻 查看更多图片

“随机抽奖”例题:假设要从10000个人中随机抽取出10人作为“中奖者”,每人对应一个0-9999中的整数,要求使用Python编程按从小到大的顺序输出中奖者数字代号。类似的“随机抽奖”程序一般均需要先导入random(随机)模块,然后借助其中的randint()、shuffle()和sample()等函数进行随机数的选取;最后使用列表或集合对数据进行存储、排序和输出。

法1.randint()生成随机整数后进行in成员运算判断

首先,通过“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)。

法2.randint()生成随机整数后存入集合“去重”

与法1类似,只不过是使用集合而非列表来存储生成的随机数:“my_set = set()”,建立一个空集合;接着,仍然是在while循环中,通过randint生成0-9999间的某随机数,将它追加到集合my_set中。由于集合中的元素是不可能存在重复数据的,因此不必像法1中的列表元素进行in成员运算判断,相当于直接进行了“去重”操作。循环结束后,仍然是使用sorted()函数进行排序并保存至列表my_list中,进行print打印输出(如图2)。

打开网易新闻 查看更多图片

法3.shuffle()随机排序后进行“切片”

首先建立列表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)。

法4.sample()随机多个“取样”

Random中的sample()功能是从序列中随机多个“取样”。首先建立列表my_list1,其值为从0-9999中随机抽取10个不重复的数据:“my_list1 = random.sample(range(10000),10)”;然后就可以使用sorted()函数进行排序,将结果保存至列表my_list2中,最后进行print打印输出(如图4)。

法5.numpy中的random.choice()随机项提取

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有多种函数和算法可以选择,体会其中的区别后你可以合理运用在其他实际应用中。