权重随机(Lua)

使用语言:Lua
实现权重随机步骤:

  • 构建一个权重列表,映射所有将数据表对应索引为的数据
  • 计算所有元素的权重总值 sum
  • 从 1-sum 中随机出要比较的值 toCompareWeight
  • sum依次循环减权重表里面的权重值
  • 直到差值小于 toCompareWeight,此时的索引下标就是随机出来的,在原数据表中得到对应索引下标就是随机值
--[[
    function:权重随机函数
    param1:要随机的表
    param2:权重列表
    return:返回的随机值
]]
function getRanomByWeight(t, weights)
    local sum = 0
    for i = 1, #weights do
        sum = sum + weights[i]
    end
    local compareWeight = math.random(1, sum)
    local weightIndex = 1
    while sum > 0 do
        sum = sum - weights[weightIndex]
        if sum < compareWeight then
            return t[weightIndex]
        end
        weightIndex = weightIndex + 1
    end
    print("compare error, return nil")
    return nil
end

--------------- test --------------

local weights = {
    [1] = 10,
    [2] = 10,
    [3] = 20,
    [4] = 20,
    [5] = 40,
}

local items = {
    [1] = "A",
    [2] = "B",
    [3] = "C",
    [4] = "D",
    [5] = "E",
}

local result = {
    ["A"] = 0,
    ["B"] = 0,
    ["C"] = 0,
    ["D"] = 0,
    ["E"] = 0,
}
local allRandomCount = 10000000
for i = 1, allRandomCount do
    local randomValue = getRanomByWeight(items, weights)
    result[randomValue] = result[randomValue] + 1
end

for i = 1, #items do
    local key = items[i]
    local count = result[key]
    local probability = count / allRandomCount
    local resultStr = key .. ": " .. "count is " .. count .. " ,probability is " .. probability
    print(resultStr)
end

---------- allRandomCount = 100 ----------
A: count is 14 ,probability is 0.14
B: count is 14 ,probability is 0.14
C: count is 19 ,probability is 0.19
D: count is 19 ,probability is 0.19
E: count is 34 ,probability is 0.34

---------- allRandomCount = 10000 ----------
A: count is 1020 ,probability is 0.102
B: count is 1011 ,probability is 0.1011
C: count is 2049 ,probability is 0.2049
D: count is 1977 ,probability is 0.1977
E: count is 3943 ,probability is 0.3943

---------- allRandomCount = 10000000 ----------
A: count is 1001325 ,probability is 0.1001325
B: count is 1000326 ,probability is 0.1000326
C: count is 1999609 ,probability is 0.1999609
D: count is 1998877 ,probability is 0.1998877
E: count is 3999863 ,probability is 0.3999863

从测试数据来看,随机次数越多,越接近单个权重值占总权重值的比例

其他

更多Blog请见:https://yiyuan1130.github.io/
Github地址:https://github.com/yiyuan1130

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值