基于微信随机红包算法

2019-02-18  本文已影响7人  CarsonChen

微信随机红包算法, 前提为知道红包的数量, 红包总金额, (红包最小金额, 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")
        

未优化前的算法会出现先点击的红包过大的问题,出现抖动,所以在更新算法中,将安全的上限进行调整.


输出结果
上一篇下一篇

猜你喜欢

热点阅读