local p = {}
---
-- 这个函数用于生成一个每分钟变化的、在[0, max)范围内、
-- 限定为三位小数的随机浮点数。
-- 在一分钟之内,它返回的都是同一个值。
--
-- @param frame 框架对象
-- @return 包含三位小数每分钟随机浮点数的字符串
function p.minutelyRandomFloat(frame)
-- 获取上限值,默认为 5.99
local max_value = tonumber(frame.args[1]) or 5.99
-- 1. 获取当前时间的表结构
-- os.date("*t") 返回一个包含 year, month, day, hour, min 等字段的表
local date = os.date("*t")
-- 2. 根据年月日时分计算一个唯一的种子
-- 构建一个大整数:YYYYMMDDHHMI
-- 例如,2025年10月14日 21:03 -> 202510142103
local minutely_seed =
date.year * 100000000 +
date.month * 1000000 +
date.day * 10000 +
date.hour * 100 +
date.min
-- 3. 使用这个每分钟固定的种子来初始化随机数生成器
math.randomseed(minutely_seed)
-- 4. 生成随机数
-- 因为种子是固定的,所以本分钟内第一次调用math.random()的结果也是固定的
-- 警告:在某些Scribunto环境中,由于种子值过大(超出C语言整型范围),
-- 它可能被截断,导致同一小时内的随机数重复。
-- 推荐使用以下更稳健的方法来混合时间元素以减少这种风险:
-- 例如:将所有元素相乘或相加,并与一个大数取模。
-- 稳健的种子构建方式(降低截断风险):
local robust_seed =
date.min +
date.hour * 60 +
date.day * 60 * 24 +
date.month * 60 * 24 * 31 + -- 乘数不用精确,只要足够大且分散即可
date.year * 365 * 24 * 60
math.randomseed(robust_seed)
-- 5. 暖机随机数生成器
math.random()
-- 6. 生成 [0, max_value) 的浮点数
local raw_result = math.random() * max_value
-- 7. 格式化为三位小数并返回
local formatted_result = string.format("%.3f", raw_result)
return formatted_result
end
-- 为了方便使用,我们假设你在模块中将其命名为 'minutelyRandomFloat'
return p