math.randomseed(os.time()) 是最常见的种子初始化写法,但多台服务器在同一秒启动时种子相同——所有服务器产生一致的随机序列,掉落与副本同步。另一个误区是用 math.randomseed(0) 做调试后忘记删除,上线后随机数全部固定。错误场景:
math.randomseed(0)
local drop = math.random(1, 10000)
每次重启后 drop 恒定不变,掉落REPLACED可预测。
种子混合多源信息(时间戳加进程ID加机器标识)确保多机不碰撞。规范写法。示例代码如下:
local function initRandom()
local seed = os.time() * 1000 + math.floor(os.clock() * 1000)
math.randomseed(seed)
end
initRandom()
local drop = math.random(1, 10000)
os.time 提供秒级精度,os.clock 补充毫秒级偏移,两者组合降低碰撞概率。示例代码如下:
local function testRandom(count)
local seen = {}
local dup = 0
for i = 1, count do
local v = math.random(1, count)
if seen[v] then
dup = dup + 1
end
seen[v] = true
end
return dup
end
三步验证:initRandom 后连续生成 10000 个随机数的重复率低于 0.5%;两次 initRandom 之间间隔 1 秒种子不同;固定种子后同一序列可复现(调试场景利用)。
需要可复现随机的场景(bug 复现、回放验证)反过来利用固定种子:记录出 bug 时的种子值,复现时用同一种子重放完整随机序列。示例代码如下:
local function replayWithSeed(seed, count)
math.randomseed(seed)
local result = {}
for i = 1, count do
result[i] = math.random(1, 10000)
end
return result
end
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏】 一、一行代码拆解:score = 3000 - used 10 —— 副本评分的全部骨架:基础分减去用时惩罚,分数…
【语法】 一、隐蔽陷阱:Lua 没有四舍五入函数,math.floor(2.5) 得 2 恒向负无穷取整——正数的四舍五入要…
【游戏】 一、业务场景:攻城战开打,会长世界喊话等人集合耽误 8 分钟,守军早已布防;集结令上线——会长发起,在线成员一键传…
【语法】 一、抛坑提问:乱序编号 {100, 4, 200, 1, 3, 2} 里最长连续段是 1 到 4 长度 4——排序…
【语法】 一、抛坑提问:统计第 1 到第 10 项,写 for i = 1, t - 1 少算一个,写 for i = 1,…
【游戏】 一、一行代码拆解:if old and old = actor then kick(old) end —— 顶号的…