微信隨機(jī)紅包算法, 前提為知道紅包的數(shù)量, 紅包總金額, (紅包最小金額, 0.01)
為防止浮點(diǎn)數(shù)計算出現(xiàn)問題,此處會將所有的計算方式擴(kuò)大100倍進(jìn)行.
// 普通算法
for i in 1..<num {
// 設(shè)置安全紅包上限
let safeTotal = total - (num - i) * min
// 得出隨機(jī)紅包
let money = Int(arc4random() % UInt32(safeTotal)) + min
// 剩余錢數(shù)
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 {
// 設(shè)置安全紅包上限
let safeTotal = (total - (num - i) * min) / (num - i) // 隨機(jī)平均上限
// 得出隨機(jī)紅包
let money = Int(arc4random() % UInt32(safeTotal)) + min
// 剩余錢數(shù)
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")
未優(yōu)化前的算法會出現(xiàn)先點(diǎn)擊的紅包過大的問題,出現(xiàn)抖動,所以在更新算法中,將安全的上限進(jìn)行調(diào)整.
輸出結(jié)果