举个栗子。
现在从我们班选了6个人,分成两组,需要emmm,比如说去打僵尸
1组分配狙击枪,2组分配步枪。
那么这时候就出现问题了:显然手持步枪冲锋作战死的更快,所以大家都想去1组。
那么这时候就需要进行公平的分组:抓阄
为了跟本文内容有关系所以 大家暂定为用一个python程序来实现分组。nice√
那么,思路如下:
首先统计6个人的姓名(或者编号),把它们都放在列表lovelive里面。
可是μ‘s不是9个人吗
然后用1个空列表l0和原来的列表lovelive分别存放1组和2组人员的姓名(或编号)。
用随机数取下标的值以保证100%公平√
每次取1个值x,放入空列表l0中。
每次取完值之后就把这个x从lovelive中删掉避免重复。
取到3个值就停。
这样l0就能取到3个人,而列表lovelive就剩下另外3个人。
这样一来,思路就基本确定了。
import random
str1 = 'kinlrmi.soulrn.christine.christian.saph.laflosia'
ll = str1.split('.') #我觉得这样写比直接在列表里挨个添加姓名更快一点
l0 =[]
while len(ll) != 3: #当ll中的3个元素被添加到l0中时,就实现平均分组了
a = len(ll)-1 #确定x的取值范围上限。因为程序会修改ll中元素的总数
x=random.randint(0,a)
l0.append(ll[x]) #将随机得到的元素添加到l0中
ll.remove(ll[x]) #添加完了之后把ll中这个项删掉。
print(l0,ll)
- len()得到的值是列表中元素的个数。比如str1=[1,2,3]有三个元素,len(str1)得到的值就是3,减去1得到的就是对应末位元素3的下标。
以上就是一个比较基础的版本。
这时候啊,写程序的同学就猫病就犯了,他觉得这样不能体现出他的nb 傻逼 之处
所以他重新写了一个列表嵌套的(其实反而不那么好用):
import random
str1 = 'kinlrmi.soulrn.christine.christian.saph.laflosia'
list1 = str1.split('.') #把str1变成列表
list2 = [[],[]] #赋两个组初始值为空
while len(list2[1]) != 3: #为了保证每个组都分到三个人
list2 = [[],[]] #如果没有实现均分那就重新分,重置分组为空列表
for i in list1: #从list1第一个元素开始,顺序放入随机选定的组
x = random.randint(0,1) #随机选一个组
list2[x].append(i) #把list1中的元素放入选定的组
else:
print(list2)
简单理解一下:
- 第一个程序是固定两个分组,随机挑选人名然后塞进组里面。
- 第二个组是顺序遍历人名,随机塞到某一个分组里面。
这样写代码更易于维护,比如两个组变成三个组,比如6个人变成9个人,都是可行的。
唯一有一个小问题就是,如果用第二个代码来运算的话,连续1000次都没有随机到平均分配的话,程序就会停止运行(用的IDE是vs code)。
我觉得应该没有人这么脸黑吧

本文介绍了如何使用Python实现公平的分组算法,通过随机数确保分组的公正性。首先,将人员列表随机分配到两个组,然后讨论了一种更灵活的列表嵌套方法,适用于分组数量变化的情况。在极端情况下,如连续1000次未达到平均分配,程序可能会停止运行。
1543

被折叠的 条评论
为什么被折叠?



