python 简单地实现平均分组问题

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

举个栗子。

现在从我们班选了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)。

我觉得应该没有人这么脸黑吧
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值