如何用算法实现在线卡牌游戏中Bot玩家的均匀分布?
均匀分布Bot的座位安排算法
核心思路是把人类玩家(H)均匀拆分为Bot数量(B)个分组,每个分组的人类数量差异不超过1,再在每个分组后拼接一个Bot(B),最终得到均匀分布的座位序列。
算法步骤
- 边界处理:如果没有Bot,直接返回
H重复H次;如果没有人类玩家,返回B重复B次。 - 计算分组大小:对每个Bot对应的分组(共B个),计算该组的人类数量:
其中current_h = (H * (i + 1)) // B - (H * i) // Bi是分组索引(从0到B-1)。这个公式能保证每个分组的大小要么是H//B,要么是H//B + 1,且这些包含更多人类的分组会均匀分布在序列中,不会集中在某一段。 - 构建序列:遍历每个分组,先拼接
current_h个H,再拼接一个B,最终得到完整的座位字符串。
示例验证
输入
6 3(H=6,B=3):- 每个分组的
current_h计算:- i=0: (6*1)//3 - 0 = 2 →
HHB - i=1: (6*2)//3 - 2 = 4-2=2 →
HHB - i=2: (6*3)//3 -4=6-4=2 →
HHB
- i=0: (6*1)//3 - 0 = 2 →
- 最终结果:
HHBHHBHHB,完全符合预期。
- 每个分组的
输入
6 4(H=6,B=4):- 每个分组的
current_h计算:- i=0: (6*1)//4 -0=1 →
HB - i=1: (6*2)//4 -1=3-1=2 →
HHB - i=2: (6*3)//4 -3=4-3=1 →
HB - i=3: (6*4)//4 -4=6-4=2 →
HHB
- i=0: (6*1)//4 -0=1 →
- 最终结果:
HBHHBHBHHB,与你期望的HHBHBHHBHB仅起始分组不同,两者都是Bot均匀分布的最优解——Bot之间的人类数量交替为1和2,没有集中扎堆的情况。
- 每个分组的
伪代码实现
function generateSeating(H, B): if B == 0: return 'H' * H if H == 0: return 'B' * B result = '' for i from 0 to B-1: current_h = (H * (i + 1)) // B - (H * i) // B result += 'H' * current_h + 'B' return result
这个算法适用于任意H和B的组合,能保证Bot尽可能均匀分布,满足游戏的公平性要求。
内容的提问来源于stack exchange,提问作者Bmoe
相关产品推荐
相关产品推荐

