谁去开会?


本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50912208


学院要召开第xxx届研究生学生代表大会,各个班级需要选举出代表。对于各班的代表基本要求,巴拉巴拉一大堆,这里就不列举了,其中有一条数量规定是这样:

班委、党支部委员和团支部委员选出代表4名,其他班级成员代表6名。

我们来使用python随机方法选举产生,首先,指定班干部以及班级成员名单(这里都用代号):

# python3

# 班委
class_committees = ['A', 'D', 'E', 'K', 'N', 
                   'V', 'W', 'Z']
# 所有班级成员
class_member_list = ['A', 'B', 'C', 'D', 'E',
                   'F', 'G', 'H', 'I', 'G',
                   'H', 'I', 'J', 'K', 'L',
                   'M', 'N', 'O', 'P', 'Q',
                   'R', 'S', 'T', 'U', 'V',
                   'W', 'X', 'Y', 'Z']

没有其他任何多余约定的情况下,当然可以直接随机选举,random模块可以轻松解决:

import random

COUNT_COMMITTEES = 4
COUNT_COMMON_MEMBER = 6

print(random.sample(set(class_committees), COUNT_COMMITTEES))
print(random.sample(set(class_member_list) - set(class_committees), COUNT_COMMON_MEMBER ))

这样就可以得到一组符合要求的名单(随机算法,每次运行结果都不一样,我们只取第一运行的结果):

['N', 'V', 'D', 'K']
['P', 'M', 'B', 'S', 'R', 'T']

为了增加趣味以及坑害无辜善良的同志们,班长觉得加入抢红包环节,红包口令就是赤裸裸的“我要去”,两种方案:

  • 发10个红包,抢得红包者,作为初选者
  • 发(班级人数-10)个红包,没抢得者,作为初选者

很明显,如果大家已经知情的情况下,后者更能调动大家的积极性,但是风险也是有的,抢红包都不积极,对于这种活动一般也不会积极。

我们现在选择前者,得到了抢到红包的10个人:

['V', 'W', 'R', 'H', 'I', 'P', 'J', 'U', 'M', 'S']

事事不如意十有八九,此时,并不一定刚好满足班委4人,其成员6人的要求,那就随机调整一下吧:

red_packets = ['V', 'W', 'R', 'H', 'I', 'P', 'J', 'U', 'M', 'S']
common_member = set(class_member_list) - set(class_committees);     # 除班级委员之外的同学

committees_packets = set(class_committees) & set(red_packets) # 抢红包的班委
common_member_packets = set(common_member) & set(red_packets) # 抢红包的其他同学
print(committees_packets, '\n', common_member_packets, '\n')


count_cp = len(committees_packets)
if (count_cp < COUNT_COMMITTEES):
    committees_final_list = committees_packets | set(random.sample(set(class_committees) - committees_packets, COUNT_COMMITTEES - count_cp))
    member_final_list = set(random.sample(common_member_packets, COUNT_COMMON_MEMBER))
    print(committees_final_list, '\n', member_final_list)
else:
    committees_final_list = random.sample(committees_packets, COUNT_COMMITTEES)
    member_final_list = common_member_packets | set(random.sample(common_member - common_member_packets, count_cp - COUNT_COMMON_MEMBER))
    print(committees_final_list, '\n', member_final_list)

选取编译执行的一组结果:

{'V', 'W'} 
 {'R', 'U', 'I', 'H', 'M', 'P', 'J', 'S'} 

{'V', 'W', 'K', 'D'} 
 {'U', 'I', 'H', 'M', 'P', 'S'}

源自:本人个人博客网站yhl’s blog

posted on 2016-03-17 14:18  疯子123  阅读(158)  评论(0编辑  收藏  举报

导航