谁去开会?
本系列文章由 @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