小五
如果搞抽奖活动的话,经常会遇到这类问题:如何从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
模块中随机抽取的几个函数。大家可以猜猜我平时抽奖用的是哪个函数呢?