如何用Python进行随机抽奖?

788 阅读3分钟

大家好,我是小五🧐

如果搞抽奖活动的话,经常会遇到这类问题:如何从50个人中随机抽取5个人获得奖品

如果用Python来抽取的话,一般会用到标准库中的random模块,该模块实现了各种分布的伪随机数生成器,以及和随机数相关的各种实用函数。

下文我将简单介绍random模块中的几个函数,有的可以生成随机浮点数、整数、字符串,有的可以帮你随机选择列表序列中的一个元素,打乱一组数据等。

random()

random()函数在区间 [0.0, 1.0) 内均匀生成随机浮点数,是模块中几乎所有函数的基础。

import random
random.random()

导入random模块后,调用random()函数后即可生成随机浮点数。

我们一般把待抽取的人名都放在列表中👇

name_list = ['赵1','钱2','孙3','李4','周5','吴6','郑7','王8','冯9','陈0']

这时候如果能生成随机整数再利用列表索引,生成对应的随机人名不就行了嘛。那就需要使用另一个函数randint()去生成随机整数啦。

randint()

randint()随机生一个整数int类型,可以指定这个整数的范围,有上限和下限值。

name_list = ['赵1','钱2','孙3','李4','周5','吴6','郑7','王8','冯9','陈0']
random.randint(0,len(name_list)-1)
name_list[random.randint(0,len(name_list)-1)]

这里我们设置了randint随机数范围是待抽取人名的列表长度。

这样就随机抽取了一个人名,如果想一次性抽取多个人名呢?循环就好了

sample=[]
for i in range(5):
    sample.append(name_list[random.randint(0,len(name_list)-1)])
print(sample)

可以看到随机抽取的元素出现了重复,那还需要去重。

这里需要改两个地方,先将for循环改为while循环结构,判断条件为len(my_list1) < 5。然后再增加一个条件判断语句,用来防止多次生成的随机数中有重复值出现。

sample=[]
while len(sample) < 5:
    name = name_list[random.randint(0,len(name_list)-1)]
    if name not in sample:
        sample.append(name)
print(sample)

这样也就实现了“去重的效果”

choice()

实际是两个函数:choice()choices()

random.choice(seq)

从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError

random.choices(population, weights=None, *, cum_weights=None, k=1)

返回从 population 进行 k 次随机抽样结果的列表,即有重复(有放回)随机抽样。

这种办法随机抽取的元素也是可以重复的,如果想去重可以参考前文。

sample()

sample(n) 是指从序列中选择n个随机且独立的元素。

random.sample(name_list,5)

非常简单,就从列表name_list中抽取了5个不重复的数据。

shuffle()

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

random.shuffle(name_list)
print(name_list)

前文的各种函数使用时,都没有将原有序列改变。但shuffle()将原列表直接“打乱”顺序,形成一种随机的效果。

这时候通过列表切片,即可达成随机抽取的目的。

name_list[:5]

好了,本文我们讨论了random模块中随机抽取的几个函数。大家可以猜猜我平时抽奖用的是哪个函数呢?

大家如果本文涉及的代码感兴趣,可以在【快学Python】后台回复“随机”即可获取对应代码文件👇

1