本文由苏三说技术分享,原题“微信群聊功能,原来是这样设计的!”,即时通讯网进行了排版和内容优化等。
{随机码,用户列表[用户A(ID、名称、头像)]}
import ( "fmt" "math" "math/rand" "strconv" ) type RedPack struct { SurplusAmount float64 // 剩余金额 SurplusTotal int // 红包剩余个数 } // 取两位小数 func remainTwoDecimal(num float64) float64 { numStr := strconv.FormatFloat(num, 'f', 2, 64) num, _ = strconv.ParseFloat(numStr, 64) return num } // 获取随机金额的红包 func getRandomRedPack(rp *RedPack) float64 { if rp.SurplusTotal <= 0 { // 该红包已经被抢完了 return 0 } if rp.SurplusTotal == 1 { return remainTwoDecimal(rp.SurplusAmount + 0.01) } // 向下取整 avgAmount := math.Floor(100*(rp.SurplusAmount/float64(rp.SurplusTotal))) / float64(100) avgAmount = remainTwoDecimal(avgAmount) // 生成随机数种子 rand.NewSource(time.Now().UnixNano()) var max float64 if avgAmount > 0 { max = 2*avgAmount - 0.01 } else { max = 0 } money := remainTwoDecimal(rand.Float64()*(max) + 0.01) rp.SurplusTotal -= 1 rp.SurplusAmount = remainTwoDecimal(rp.SurplusAmount + 0.01 - money) return money } func main() { rp := &RedPack{ SurplusAmount: 0.06, SurplusTotal: 5, } // 每个红包先保留 0.01 的余额 rp.SurplusAmount -= 0.01 * float64(rp.SurplusTotal) total := rp.SurplusTotal for i := 0; i < total; i++ { fmt.Println(getRandomRedPack(rp)) } }
0.01、0.01、0.01、0.01、0.02
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.156250 second(s), 42 queries , Gzip On.