目 录CONTENT

文章目录

新年到了,送你一份年会python抽奖代码

慧行说
2019-01-04 / 0 评论 / 0 点赞 / 628 阅读 / 1,009 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-05-21,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

新的一年到了,相信很多公司都会举办年会吧!而年会中最欢迎的环节就是抽奖了,运气好的能抽个大奖,开开心心回家过年;运气不好的也没事,重在参与嘛,就像我一样,年年都没咋中奖,但是仍然很期待抽奖,或许这就是人之本性吧,喜欢未知的惊喜,也叫随机惊喜。

今天我就想来分析下抽奖的需求,对于传统抽奖而言,一般都是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()

运行上文代码,我们得到下图的结果:

FTo09P.png

可以看到,一共有9999名员工,我们假设一共3个奖项,一二三等奖各一名;第一次抽三等奖,获奖者工号为7758,然后将中奖者移出抽奖池,现在的抽奖池只有9998名员工,然后依次循环,每抽中一名选手抽奖池就移出一名员工,这样可以保证永远不会重复中奖。

最后,一个简单的抽奖小应用就写完了,其实非常简单。当然,我上面的代码其实可以优化的地方非常多,也有一些不合理的地方,后续再优化吧。

0

评论区