Lua实现简单的伪随机红包算法

今天刚好用Lua实现了一个伪随机红包,可能可能随机的值并没有太好,如果有更好的想法可以评论说出来大家讨论一下;这个随机红包的的要求是给一个指定的数额,和一个最大领取金额和最小领取金额,然后指定给多少个人随机领取;
思路:

(1)第一步:每次的随机数范围通过总金额 - (已被领取金额+剩下所有人的最低金额)进行计算后,放大倍数来拿到一个范围更大的随机数再除掉放大倍数
(2)第二步:进行计算每个人能领取到的随机金额,然后若是没有分配到的将给一个最低值
(3)第三步:若是剩下的金额还比领取的人数还多则先平均后,平均后若还有剩下则把剩下的都给第一个领取的人

-- 随机数函数
function rank( min,max,num,sum )
    local sub = 0
    local res = {}
    for i=num,1,-1 do
        local randMax = sum - (sub+(min*num))   -- 保证后面的人都有一个最低值的
        local rand = math.random(min,randMax*10000) -- 放大倍数
        rand = rand / 10000
        if rand > max then
            rand = math.random(min,max)
        end
        sub = sub + math.floor(rand)
        res[i] = math.floor(rand)
    end
    -- 计算已发总数
    local subSum = 0
    for i=1,num do
        if not res[i] or res[i] == 0 then
            res[i] = min
        end
        subSum = subSum + res[i]
    end

    if (sum-subSum) ~= 0 then   -- 平均后将剩余的都给第一个
        local rest = sum - subSum
        local arvg = math.floor(rest/num)
        if arvg > 0 then
            for i=1,num do
                print("平均数 ",i,arvg,res[i])
                res[i] = res[i] + arvg
            end
        end
        res[1] = res[1] + rest
    end 

    return res
end

-- 测试与打印
local res = rank(1,888,5,1000)
for i=1,5 do
    print(res[i])
end

若有写得不好的地方敬请纠正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值