CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
Lua实战权重抽奖

【Lua实战】权重轮盘:动态权重的原地缩减抽取

2026-09-23 00:25 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本Lua实战权重抽奖

实战应用:用在哪里

金盒转盘 8 格奖池,普通奖越来越疲,大奖既要概率递增又不能失控。动态权重轮盘:每抽一次普通奖权重缩减 10 点、大奖权重上涨 30 点,累计 60 次硬保底必出裁决之杖碎片,期望值全程可算。动态迁移让每一抽都在改变下一抽的分布,玩家可感知越抽越近,保底计数在界面常驻,两套预期同时管理。保底与概率递增两条线叠加后,大奖的期望产出仍可用积分方程逐次算出,数值组按公式而非体感调参。

轮盘抽取的实现

抽取按权重总和取随机数,逐格扣减落在哪格算哪格,奖池结构里区分金币奖与道具奖两种发放。

lua
local WHEEL = {
    { name = "金币50000",    w = 300, gold = 50000 },
    { name = "强化石",       w = 250, item = "强化石",   cnt = 2 },
    { name = "祝福油",       w = 200, item = "祝福油",   cnt = 1 },
    { name = "裁决之杖碎片", w = 40,  item = "裁决之杖碎片", cnt = 1 },
}
local function draw()
    local sum = 0
    for _, s in ipairs(WHEEL) do sum = sum + s.w end
    local r = math.random(1, sum)
    for _, s in ipairs(WHEEL) do
        r = r - s.w
        if r <= 0 then return s end
    end
    return WHEEL[1]
end

原地缩减与硬保底

每抽一次执行权重迁移:普通格各缩 10 点,大奖格涨 30 点,封顶 500;玩家累计次数到 60 直接发大奖并清零计数。

lua
local function shift()
    for _, s in ipairs(WHEEL) do
        if s.item == "裁决之杖碎片" then
            s.w = math.min(500, s.w + 30)
        elseif s.w > 50 then
            s.w = s.w - 10
        end
    end
end
function spin(actor)
    if not checkitemw(actor, "金盒钥匙", 1) then
        sendmsg(actor, 0, "需要金盒钥匙一把")
        return
    end
    takeitem(actor, "金盒钥匙", 1)
    local cnt = tonumber(getplayvar(actor, "HUMAN", "SPIN_CNT") or "0") + 1
    local s = draw()
    if cnt >= 60 then
        for _, x in ipairs(WHEEL) do
            if x.item == "裁决之杖碎片" then s = x end
        end
        cnt = 0
    end
    setplayvar(actor, "HUMAN", "SPIN_CNT", cnt, 1)
    if s.gold then giveitem(actor, "金币", s.gold) end
    if s.item then giveitem(actor, s.item, s.cnt or 1) end
    shift()
    sendmsg(actor, 0, "抽中:" .. s.name .. ",距保底还剩 " .. (60 - cnt) .. " 次")
end

验证与监控

一万次模拟统计各格命中率,收敛值与权重比例核对;期望值按迁移后权重重算,偏差超一成即报;保底路径第 60 次必出碎片。监控每期活动的钥匙消耗与大奖产出比,产出超发即冻结活动调权重。并发压测同一账号 10 连抽,核对扣钥匙、计数、发奖三步的顺序一致性。模拟脚本把一万次抽取的逐次命中率导出成表,数值组按表复核迁移公式。

踩坑记录

math.random 没播种,每次重启后抽奖序列一模一样,被玩家录屏对比抓到,启动时用 os.time 播种。权重缩减只减普通格没设下限,500 抽后普通格权重归零,奖池名义 8 格实际只剩 2 格,50 点下限保住了池面。SPIN_CNT 在发奖前清零,保底那一次的计数被吞,玩家感知少抽一次,顺序改为先判后清。金币奖 50000 一次叠加双倍活动被当成了刷金币入口,活动期把金币奖折半发放并写进规则公告。WHEEL 表是脚本级共享状态,多副本部署时各自迁移不同步,活动收敛为单实例执行,副本只读。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

案例复盘首杀归属

【案例复盘】BOSS 首杀归属争议的仲裁复盘

实战应用:用在哪里 祖玛教主全服首杀出了大事:行会 A 磨掉九成血,行会 B 赶来收下终结一击,系统按击杀者把首杀公告给了 …

2026-09-23 00:53 996 技术组 · 0 阅读
后端接口红名洗白

【后端接口】红名洗白:洗红任务的进度接口实现

实战应用:用在哪里 PK 值 200 以上进红名村,出来靠洗红任务:击杀红名村恶徒掉善恶令,红名村老者按每枚减 10 点 P…

2026-09-23 00:53 996 技术组 · 0 阅读
界面UI技能栏交互

【界面UI】技能槽位交换:图标选中与槽位互换的界面实现

实战应用:用在哪里 烈火剑法常年压在 8 号槽,手指够不着,想换到 2 号槽。技能栏交互做两次点击交换:点源槽高亮选中,点目…

2026-09-23 00:53 996 技术组 · 0 阅读
玩法策划藏宝探索

【玩法策划】藏宝罗盘:全服藏宝点指引的玩法设计

实战应用:用在哪里 玩家对固定地图刷腻了,缺一个全服一起动的探索玩法。藏宝罗盘每天 8 点在全服刷 3 个藏宝点,罗盘道具指…

2026-09-23 00:53 996 技术组 · 0 阅读
玩法策划经济物价

【玩法策划】物价平准:系统商店物价调节的玩法设计

实战应用:用在哪里 商人号每天从系统商店搬 5 万瓶金创药去摆摊倒卖,药品市场翻着倍涨。物价平准机制让系统商店的畅销品随全服…

2026-09-23 00:53 996 技术组 · 0 阅读
数据存储对账日结

【数据存储】日结对账:跨天结算数据的对账流程

实战应用:用在哪里 经济类投诉最怕说不清:玩家说商店多扣了钱,运营翻不出账。日结对账把发放侧与消耗侧各立一个计数器,全天累加…

2026-09-23 00:53 996 技术组 · 0 阅读