新的一年到了,相信很多公司都会举办年会吧!而年会中最欢迎的环节就是抽奖了,运气好的能抽个大奖,开开心心回家过年;运气不好的也没事,重在参与嘛,就像我一样,年年都没咋中奖,但是仍然很期待抽奖,或许这就是人之本性吧,喜欢未知的惊喜,也叫随机惊喜。
今天我就想来分析下抽奖的需求,对于传统抽奖而言,一般都是HR把所有人的姓名跟一个号码对应,然后用乒乓球也好,小纸条也好,反正有多少参与人就有多少抽奖物料。然后拿一个大箱子把所有的乒乓球或者号码纸条放到箱子里面。开始抽奖时,就由某某领导开始用手随机抽取。对于这种抽奖方式而言,抽完奖之后乒乓球或者纸条就没用了,箱子也没用了,难免有些不环保,所以我想着用代码的方式实现抽奖。
熟悉了传统的抽奖方式之后我们得知要抽奖首先有以下的必要条件:
- n个员工的号码牌;
- 大箱子:抽奖池;
- 随机抽取:满足抽奖的公平性;
在满足了上述必要条件之后我们用一句话归纳下抽奖算法:**在n个员工中随机选择m名中奖者,已经中奖的人需要从抽奖池中去除(防止重复中奖),然后进行下一轮的随机选择,如此循环。**除了在抽奖中应用之外,比如一些需要x位不重复的随机数也可以用这个算法实现。
主要功能为:
- 构建n名员工工号;
- 定义一个抽奖池;
- 用random模块下的choice()随机选择m名员工工号,为了说明问题,当前文章m等于1;
- 利用remove()移除已中奖的用户,防止重复中奖;
下面直接上代码:
# _*_ coding:utf-8 _*_
import random
import math
def main():
# 定义一个抽奖池
pool = []
# 从1循环到10000,得到了9999个数字,然后添加到抽奖池pool
for i in range(1, 10000):
# print(i)
pool.append(i)
print("抽奖池总人数:", len(pool))
print("-" * 20)
for j in pool:
winner = random.choice(pool)
# 将中奖者从抽奖池中移出
pool.remove(winner)
print("三等奖获奖者为:", winner)
print("当前抽奖池人数为:", len(pool))
# print("当前未中奖的用户为:", pool)
print("-" * 20)
for i in pool:
winner = random.choice(pool)
# 将中奖者从抽奖池中移出
pool.remove(winner)
print("二等奖获奖者为:", winner)
print("当前抽奖池人数为:", len(pool))
print("-" * 20)
for i in pool:
winner = random.choice(pool)
# 将中奖者从抽奖池中移出
pool.remove(winner)
print("一等奖获奖者为:", winner)
print("当前抽奖池人数为:", len(pool))
print("-" * 20)
if __name__ == '__main__':
main()
运行上文代码,我们得到下图的结果:
可以看到,一共有9999名员工,我们假设一共3个奖项,一二三等奖各一名;第一次抽三等奖,获奖者工号为7758,然后将中奖者移出抽奖池,现在的抽奖池只有9998名员工,然后依次循环,每抽中一名选手抽奖池就移出一名员工,这样可以保证永远不会重复中奖。
最后,一个简单的抽奖小应用就写完了,其实非常简单。当然,我上面的代码其实可以优化的地方非常多,也有一些不合理的地方,后续再优化吧。
评论区