如何基于数组最高频数值调整AI权重选择的概率逻辑
问题根因
你的逻辑bug出在特殊分支的判断条件粒度过粗:仅判断了「统计得到的最高频数值为1」就触发50%选2的逻辑,缺失了数组内所有元素均为1这个必要前置校验,导致只要1是数组中的最高频值(哪怕数组内混杂其他数值),都会误触发该分支。
修复思路
整个逻辑拆成3个环节实现即可,不需要复杂算法:
- 遍历输入的历史数值数组,用字典统计每个数值的出现频次,同时记录数组总长度
- 特殊分支前置校验:只有当数值1的统计频次完全等于数组总长度时,才触发「50%概率选择数值2」的特殊逻辑,剩余50%概率走常规最高频反制逻辑即可
- 非特殊场景直接走原有原型的常规逻辑:筛选出出现频次最高的玩家历史出值,AI选择对应克制选项,权重和数值出现频次正相关
原型参考代码(未做代码规范与性能优化)
function aiWeightChoose(playerHistoryArr) { const arrLength = playerHistoryArr.length; // 频次统计 const frequency = {}; for (const val of playerHistoryArr) { frequency[val] = (frequency[val] || 0) + 1; } // 特殊分支:仅全为1时触发50%选2的逻辑 if (frequency[1] === arrLength) { return Math.random() < 0.5 ? 2 : getNormalCounterChoice(frequency); } // 常规最高频反制逻辑,复用你原有原型的实现即可 return getNormalCounterChoice(frequency); } // 常规反制选择逻辑 function getNormalCounterChoice(freqMap) { let maxFrequency = -1; let mostCommonVal = null; for (const [val, count] of Object.entries(freqMap)) { if (count > maxFrequency) { maxFrequency = count; mostCommonVal = Number(val); } } // 这里替换成你业务里实际的克制值映射,比如猜拳场景下1克3、2克1这类规则 const counterRule = {1:2, 2:3, 3:1}; return counterRule[mostCommonVal]; }
额外说明
- 如果后续需要新增其他「数组全为某值时触发特殊选择概率」的规则,直接复用「目标值统计频次 === 数组总长度」的判断条件即可,不需要重构整体逻辑
- 如果你需要给多个高频值分配不同权重,只需要在常规逻辑里把每个值对应的克制选项权重和该值的出现频次做绑定即可,不影响特殊分支的判断
内容的提问来源于stack exchange,提问作者ANullPtr
相关产品推荐
相关产品推荐

