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

Lua随机字符串:字符集取模的序列生成

2026-10-02 03:32 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【语法算法】

字符集里去掉了0、O、1、I——先看这一行的取舍。随机字符串生成的第一步不是生成,是删字符:把肉眼易混的四个成员请出字符集,生成出来的码才敢发给玩家当兑换码。随机字符串的写法就是一本字符集的账:字符集定多大、每一位怎么取、拼几位算一枚,账算清楚了,生成的码才既随机又可读。这篇把整套写法拆开:配置表、字符集裁剪、取模采样、序列拼装、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:字符集取模的序列生成

演示场一本码簿。点「生成一枚」:一枚八位的码从字符集里逐位采样拼出来——每位都是三十二选一,字符集里没有0、O、1、I这四个易混分子。点「连发十枚」:十枚码连着落进码簿,一摞排开——肉眼扫一遍,没有两枚长得像兄弟。演示里试一笔账:三十二的字符集、八位的长度,能生成的总数是三十二的八次方——一万亿多枚,比全场玩家人手一万枚还多。随机字符串教的是采样:每一位独立取模,拼出的序列才是真随机。

mermaid
flowchart TD
A[定字符集和长度] --> B[逐位循环]
B --> C[取模采样一个字符]
C --> D[拼进序列]
D --> E{攒够长度}
E -- 否 --> B
E -- 是 --> F[输出一枚码]
demo
 fx-randstr

二、底层原理:一次取模采样加一次序列拼装

模块的机关是一对搭档。取模采样:每一位从字符集里按随机数取模挑一个——三十二选一,每一位独立开奖,前后位互不串味。序列拼装:采样的字符逐位拼进序列——拼满八位算一枚,拼装的过程就是随机从"一个数"变成"一串码"的过程。和随机数直出的分野在"随机字符串管的是可读的随机":随机数是给机器看的,随机字符串是给人抄写的——字符集裁掉易混分子,抄写和辨认才不吵架。

字符集为什么是三十二不是六十二?六十二的全字符集每一位信息量更大,但0和O、1和I在三号字体里是一对双胞胎——玩家手抄兑换码抄错一位,客服的账就多一笔;三十二选一是可读性和容量的折中,一万亿枚对任何玩法都够撒。 敢发才敢用。

三、核心代码:完整模块(上·骨架)

lua
-- @file RandStr.lua
-- 随机字符串 —— 字符集取模的序列生成

local RandStr = {}

local CONST = {
    字符集         = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789",
    CODE_LEN      = 8,

    AUTOINC_BASE  = 1165000,
}

local _codes     = {}
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "RDS",
        CONST.AUTOINC_BASE + _autoInc)
end

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function PickChar()
    local n = #CONST.字符集
    local idx = math.random(1, n)
    return CONST.字符集:sub(idx, idx)
end

function RandStr.Codes()
    return _codes
end

四、核心代码:完整模块(下·采样拼装与查重入簿)

lua
-- 采样拼装:逐位取模拼一枚码
function RandStr.Gen()
    local code = {}
    for _ = 1, CONST.CODE_LEN do
        code[#code + 1] = PickChar()
    end
    return table.concat(code)
end

-- 查重入簿:撞码自动重摇,簿满为止
function RandStr.GenUnique()
    for _ = 1, 20 do
        local code = RandStr.Gen()
        if not _codes[code] then
            _codes[code] = true
            return code
        end
    end
    ShowTip("连撞二十次——考虑扩一位长度")
    return nil
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("生成一枚", function()
        local code = RandStr.GenUnique()
        if code then
            ShowTip("生成:" .. code)
        end
    end)
    ShowTip("技能已加载: 随机字符串 (调试按钮触发)")
end, 1.0)

function RandStr.Unload()
    _codes = {}
end

return RandStr

五、机制问答

问:撞码了怎么办?
答:重摇——查重入簿的循环里撞码自动重摇二十次,字符集够大时撞码本身比中彩票还难,二十次只是保险。

问:生成的码区分大小写吗?
答:区分——字符集全大写,比对时输入要转大写再比,账面上的大小写规矩要在录入口统一。

问:为什么不用纯数字做码?
答:短——纯数字八位只有一亿枚,三十二字符集八位有一万亿枚,同样的位数容量差一百倍。

问:随机字符串能当安全凭证吗?
答:能但不建议——客户端随机数对防篡改没有保证,安全凭证要用安全随机源,这是教学码和生产码的分界线。

问:码的长度越长越好吗?
答:不是——长度翻一位容量翻三十二倍但抄写成本也涨,够用加保险就是合适的长度。

六、调参与实战怎么用

第四笔是字符集的裁剪:去掉易混四分子是可读性的底线——0和O、1和I在三号字体里是双胞胎,裁掉的每一位都省一笔客服工单。第三笔是长度的账:八位三十二选一的容量是一万亿——容量按用量乘保险倍数倒推,别拍脑袋定长度。第二笔是撞码的循环:查重入簿重摇二十次是撞码的保险——撞码概率极低,二十次封顶只是防御性编程的礼节。第一笔是采样的独立性:每一位独立取模——上一位的种子不喂下一位,位与位之间互不串味才是真随机。常见坑三个:字符集混入易消分子导致玩家抄错;撞码重摇没有封顶死循环;大小写规矩录入口不统一比对全错。

实战里随机字符串是发码类玩法的通用件:兑换码、邀请码、房间的房间号、临时文件的临时名,全是"字符集采样逐位拼装"的同一副骨架。组里的约定是:凡是给玩家抄写的码一律走裁剪过的字符集——玩家抄错的每一枚码,最后都变成客服的工单。这篇的模块照抄能跑,改的就是字符集那张表。

实战里随机字符串还有一个隐藏的坑——大小写的录入。字符集全是大写字母加数字,但玩家在手机上输入时输入法默认首字母大写其余小写,粘贴的时候又可能带出小写——录入口必须做一次统一的大写转换,否则一模一样的码因为大小写不同被判成两枚。这也是字符集全大写的另一个理由:录入端一次转大写就归一了,混合大小写的字符集要转两次还容易漏。这个坑不写在注释里,后人一定会踩。\n\n写完留一句给做发码系的同学:随机字符串卖的是"随机也要可读"——那枚裁掉易混分子的八位码和查重入簿的保险,是把随机数从机器语言翻译成人能抄写的一本码簿。码簿里的每一枚码都是三十二选一的八次方分之一,概率小到可以当独一无二用,玩家拿到手才敢放心地抄、放心地输。

作者履历与出处

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

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

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

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

进阶实战游戏功能

Lua自动炮台:架一个自动索敌开火

【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua元素转换:火伤转冰伤附带减速

【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua连锁引燃:一个着火引燃下一个

【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua弹射地垫:踩上去弹飞到空中

【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua时间减缓:流速减半的局部时差

【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua引力球:丢出去把怪吸过来

【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…

2026-10-02 04:50 996 技术组