微信随机红包算法, 前提为知道红包的数量, 红包总金额, (红包最小金额, 0.01)
为防止浮点数计算出现问题,此处会将所有的计算方式扩大100倍进行.
// 普通算法
for i in 1..<num {
// 设置安全红包上限
let safeTotal = total - (num - i) * min
// 得出随机红包
let money = Int(arc4random() % UInt32(safeTotal)) + min
// 剩余钱数
total -= money
let moneyStr = String(format: "%.2f", Float(money) / 100)
let totalStr = String(format: "%.2f", Float(total) / 100)
print("第\(i)个红包, 金额:\(moneyStr), 余额:\(totalStr)")
}
// 最后一个红包的金额
print("第\(num)个红包, 金额:\(Float(total) / 100), 余额:0")
total = 10000
num = 10
min = 1
sum = 0
print("------------------------------------------")
// 更新算法
for i in 1..<num {
// 设置安全红包上限
let safeTotal = (total - (num - i) * min) / (num - i) // 随机平均上限
// 得出随机红包
let money = Int(arc4random() % UInt32(safeTotal)) + min
// 剩余钱数
total -= money
let moneyStr = String(format: "%.2f", Float(money) / 100)
let totalStr = String(format: "%.2f", Float(total) / 100)
print("第\(i)个红包, 金额:\(moneyStr), 余额:\(totalStr)")
}
// 最后一个红包的金额
print("第\(num)个红包, 金额:\(Float(total) / 100), 余额:0")
未优化前的算法会出现先点击的红包过大的问题,出现抖动,所以在更新算法中,将安全的上限进行调整.
输出结果
网友评论