Lua如何生成50-500区间、均值为100的随机数并解决超界问题
你现有代码出现超出上限的原因是最终计算逻辑里使用了两个独立随机值相乘,没有做边界约束:fDistribution的最大值为5,RandomInt(min, max)最大值为500,两者相乘除以100的理论最大值为25,远高于500的上限,因此会出现溢出。
方案1:最小改动,保留原有分布特征
如果你不想调整当前已经符合预期的大部分输出分布,只需要新增边界钳位逻辑即可,对整体平均值的影响可以忽略:
local min = 50 local max = 500 local avg = 100 local fFloat = ( RandomInt( 0, avg ) / 100 ) ^ 2 -- float between 0 and 1, squared local iRange = max - min -- range of min-max local fDistribution = ( ( fFloat * iRange ) + min ) / 100 local rawResult = fDistribution * RandomInt( min, max ) / 100 -- 新增钳位逻辑,将结果严格限制在目标区间内 finalRandPerc = math.max(min, math.min(max, rawResult))
方案2:从生成逻辑根源避免溢出,匹配对数正态分布需求
如果你希望所有生成值天然落在[50,500]区间内,且均值稳定为100,可以改用截断对数正态分布生成逻辑,你可以调整sigma参数控制分布的离散程度:
local min = 50 local max = 500 local targetAvg = 100 -- 对数正态分布参数,sigma越大数值离散度越高 local mu = math.log(targetAvg) - 0.5 * (0.8^2) local sigma = 0.8 local function generateTruncatedLogNormal() local res repeat -- Box-Muller算法生成标准正态分布 local u1 = math.random() local u2 = math.random() local z = math.sqrt(-2 * math.log(u1)) * math.cos(2 * math.pi * u2) res = math.exp(mu + sigma * z) until res >= min and res <= max return res end finalRandPerc = generateTruncatedLogNormal()
内容的提问来源于stack exchange,提问作者SirenKing
相关产品推荐
相关产品推荐

