基于微信隨機紅包算法

微信隨機紅包算法, 前提為知道紅包的數(shù)量, 紅包總金額, (紅包最小金額, 0.01)
為防止浮點數(shù)計算出現(xiàn)問題,此處會將所有的計算方式擴大100倍進行.

        // 普通算法
        for i in 1..<num {
            // 設(shè)置安全紅包上限
            let safeTotal = total - (num - i) * min
            // 得出隨機紅包
            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) // 隨機平均上限
            // 得出隨機紅包
            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)先點擊的紅包過大的問題,出現(xiàn)抖動,所以在更新算法中,將安全的上限進行調(diào)整.


輸出結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容