diff --git a/application/common/library/RedpacketLua.php b/application/common/library/RedpacketLua.php index 952f24b2..8ab7fa82 100644 --- a/application/common/library/RedpacketLua.php +++ b/application/common/library/RedpacketLua.php @@ -69,7 +69,7 @@ if leftCount <= 0 or leftAmount <= 0 then return {0, "红包已抢完", 0} end --- 计算红包金额(核心修改:适配整数金币,避免0) +-- 计算红包金额(核心修复:解决3金币2红包场景第二个红包为0的问题) local amount = 0 local isFinished = 0 @@ -78,21 +78,24 @@ if leftCount == 1 then amount = leftAmount isFinished = 1 else - -- 随机算法:二倍均值法(适配整数,保证最低1) - -- 1. 计算二倍均值(整数处理,向下取整) + -- 随机算法:二倍均值法(适配整数+保底逻辑,彻底避免0) + -- 1. 基础二倍均值(整数处理) local avg = leftAmount / leftCount local maxAmount = math.floor(avg * 2) - -- 2. 确保最大金额至少为1,且不超过剩余金额-(剩余个数-1)(避免后续红包无金额可分) - -- 剩余金额-(剩余个数-1):保证剩下的每个红包至少能分1个金币 + + -- 2. 核心修复:保底限制 - 最大金额不能超过「剩余金额 - (剩余个数 - 1)」 + -- 确保剩下的每个红包至少能分到1个金币(比如3金币2红包:3 - (2-1) = 2,第一个红包最多抢2) local safeMax = leftAmount - (leftCount - 1) maxAmount = math.min(maxAmount, safeMax) - maxAmount = math.max(maxAmount, 1) -- 确保最小可随机值为1 - -- 3. 随机生成1到maxAmount之间的整数(避免0) + -- 3. 强制保证最小金额为1,最大金额不小于1 + maxAmount = math.max(maxAmount, 1) + + -- 4. 随机生成1到maxAmount之间的整数(绝对不会出现0) amount = math.random(1, maxAmount) - -- 4. 检查是否抢完(整数判断,无需浮点数误差处理) - if leftCount - 1 == 1 or (leftAmount - amount) <= 0 then + -- 5. 整数场景下的抢完判断(无需浮点数误差处理) + if (leftCount - 1) == 1 and (leftAmount - amount) == 0 then isFinished = 1 end end