微信抢红包算法—–go语言实现
主要使用Rand随机+二均值方法实现
func main() {
count, money := 10, 200
//红包总和 验证发了多少钱
sum := 0
//发红包
for i := 0; i < count; i++ {
x := SecAvg(count-i, money)
//剩余钱
money -= x
//发了多少钱
sum += x
//领红包数
fmt.Println("第", i+1, "个人领了", x, "元")
}
fmt.Println("一共发了", sum, "元")
}
func SecAvg(count, money int) int {
//红包最小值
min := 1
if count == 1 {
return money
}
//二均值法 (0,(剩余钱/剩余人数)*2)==[min,max/count * 2]
//上边界 左开右开 避免为0
max := money - min
right := (max/count)*2 + min
rand.Seed(time.Now().UnixNano())
//[min,max/count * 2]
x := rand.Intn(right) + min
return x
}
/*
第 1 个人领了 24 元
第 2 个人领了 24 元
第 3 个人领了 26 元
第 4 个人领了 15 元
第 5 个人领了 36 元
第 6 个人领了 20 元
第 7 个人领了 20 元
第 8 个人领了 17 元
第 9 个人领了 17 元
第 10 个人领了 1 元
一共发了 200 元
*/
红包到小数点后两位
count, money := 10, 200//200为2元 定钱需要 *100
//红包总和 验证发了多少钱
sum := float32(0)
//发红包
for i := 0; i < count; i++ {
x := SecAvg(count-i, money)
//剩余钱
money -= x
//发了多少钱
sum += float32(x)
//领红包数
fmt.Println("第", i+1, "个人领了", float32(x)/float32(100), "元")
}
fmt.Println("一共发了", sum/float32(100), "元")
/*
第 1 个人领了 0.2 元
第 2 个人领了 0.24 元
第 3 个人领了 0.24 元
第 4 个人领了 0.27 元
第 5 个人领了 0.26 元
第 6 个人领了 0.26 元
第 7 个人领了 0.18 元
第 8 个人领了 0.1 元
第 9 个人领了 0.06 元
第 10 个人领了 0.19 元
一共发了 2 元
*/