今天刚好用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
若有写得不好的地方敬请纠正,谢谢